if x in set([1,2,3]):
不比_ _
if x in [1,2,3]:
将列表转换为集合需要遍历列表,因此至少需要O(n)
时间。* 实际上,它比搜索项目花费的时间要长得多,因为它涉及散列然后插入每个项目。
当集合转换一次然后多次检查时,使用集合是有效的。500
实际上,通过在列表中搜索来尝试此range(1000)
操作表明,一旦您检查至少 3 次,就会发生权衡:
import timeit
def time_list(x, lst, num):
for n in xrange(num):
x in lst
def time_turn_set(x, lst, num):
s = set(lst)
for n in xrange(num):
x in s
for num in range(1, 10):
size = 1000
setup_str = "lst = range(%d); from __main__ import %s"
print num,
print timeit.timeit("time_list(%d, lst, %d)" % (size / 2, num),
setup=setup_str % (size, "time_list"), number=10000),
print timeit.timeit("time_turn_set(%d, lst, %d)" % (size / 2, num),
setup=setup_str % (size, "time_turn_set"), number=10000)
给我:
1 0.124024152756 0.334127902985
2 0.250166893005 0.343378067017
3 0.359009981155 0.356444835663
4 0.464100837708 0.38081407547
5 0.600295066833 0.34722495079
6 0.692923069 0.358560085297
7 0.787877082825 0.338326931
8 0.877299070358 0.344762086868
9 1.00078821182 0.339591026306
列表大小从 500 到 50000 的测试给出大致相同的结果。
* 实际上,在真正的渐近意义上,插入哈希表(并且,就此而言,检查一个值)不是O(1)
时间,而是线性O(n)
时间的恒定加速(因为如果列表变得太大,就会产生冲突)。这将使set([1,2,3])
操作O(n^2)
及时而不是O(n)
。然而,在实践中,通过具有良好实现的合理大小的列表,您基本上总是可以假设哈希表的插入和查找是O(1)
操作。