在python中搜索列表的最快方法

时间:2011-05-13 14:45:39

标签: python list search find set

当您执行"test" in a之类的内容a列表时,python是否对列表执行顺序搜索,还是创建哈希表表示来优化查找?在应用程序中我需要这个,因为我会在列表上进行大量的查找,所以最好做一些像b = set(a)然后"test" in b这样的事情吗?另请注意,我将拥有的值列表不会有重复数据,我实际上并不关心它的顺序;我只需要能够检查是否存在值。

4 个答案:

答案 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