【问题标题】:Python list.append if not in list vs set.add performance [duplicate]Python list.append 如果不在列表中与 set.add 性能 [重复]
【发布时间】:2017-01-04 14:20:39
【问题描述】:

在 Python 中哪个性能更高,什么是渐近复杂度(或它们是否等效)?

set.add(12)

if 12 not in somelist:
    somelist.append(12)

【问题讨论】:

标签: python


【解决方案1】:

总的来说,这套系统要快得多。测试列表中的成员资格是 O(n),与列表的大小成线性关系。添加到一个集合是 O(1),与列表中的项目数无关。除此之外,列表代码调用了两个函数:一个是检查 12 是否在列表中,另一个是添加它,而 set 操作只调用一个。

请注意,list 解决方案可能会很快,但是,当不需要将项目添加到列表中时,因为它是在列表中早期找到的。

# Add item to set
$ python -m timeit -s 's = set(range(100))' 's.add(101)'
10000000 loops, best of 3: 0.0619 usec per loop

# Add item not found in list
$ python -m timeit -s 'l = list(range(100))' 'if 101 not in l: l.append(101)'
1000000 loops, best of 3: 1.23 usec per loop

# "Add" item found early in list
$ python -m timeit -s 'l = list(range(100))' 'if 0 not in l: l.append(0)'
10000000 loops, best of 3: 0.0214 usec per loop

# "Add" item found at the end of the list
$ python -m timeit -s 'l = list(range(102))' 'if 101 not in l: l.append(101)'
1000000 loops, best of 3: 1.24 usec per loop

【讨论】:

  • 您能否详细说明“在列表中早期发现”的情况。由于列表可以包含重复的元素,如果在列表的前面找到一个项目,为什么不必添加它?
  • 如果在列表中任何地方找到该项目,则不会调用l.append。问题是,找到该项目需要多长时间。使用set,无论在集合中的哪个位置找到它都需要相同的时间。使用list,它所花费的时间与其索引成正比:列表中越早出现的项目,可以越快找到。
猜你喜欢
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2011-08-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多