当您执行"test" in a
之类的内容a
列表时,python是否对列表执行顺序搜索,还是创建哈希表表示来优化查找?在应用程序中我需要这个,因为我会在列表上进行大量的查找,所以最好做一些像b = set(a)
然后"test" in b
这样的事情吗?另请注意,我将拥有的值列表不会有重复数据,我实际上并不关心它的顺序;我只需要能够检查是否存在值。
答案 0 :(得分:52)
另请注意,我所拥有的值列表不会有重复数据,我实际上并不关心它所处的顺序;我只需要能够检查是否存在值。
请勿使用列表,而是使用set()
。它具有您想要的属性,包括快速in
测试。
我已经看到地方加速度提高了20倍甚至更高(主要是重数字运算),其中一个列表被更改为一组。
答案 1 :(得分:8)
"test" in a
的 a
会进行线性搜索。动态设置哈希表比线性搜索要昂贵得多。另一方面,"test" in b
将执行amoirt化O(1)哈希查找。
在您描述的情况下,似乎没有理由在集合上使用列表。
答案 2 :(得分:1)
我认为最好采用set实现。我知道集合有O(1)查找时间。我认为列表需要O(n)查找时间。但即使列表也是O(1)查找,切换到集合也不会丢失任何内容。
此外,集合不允许重复值。这将使您的程序具有更高的内存效率
答案 3 :(得分:-1)
列表和元组似乎有相同的时间,并使用"在"大数据的速度很慢:
>>> t = list(range(0, 1000000))
>>> a=time.time();x = [b in t for b in range(100234,101234)];print(time.time()-a)
1.66235494614
>>> t = tuple(range(0, 1000000))
>>> a=time.time();x = [b in t for b in range(100234,101234)];print(time.time()-a)
1.6594209671
这是更好的解决方案:Most efficient way for a lookup/search in a huge list (python)
超级快:
>>> from bisect import bisect_left
>>> t = list(range(0, 1000000))
>>> a=time.time();x = [t[bisect_left(t,b)]==b for b in range(100234,101234)];print(time.time()-a)
0.0054759979248