在python中搜索列表的最快方法
Posted
技术标签:
【中文标题】在python中搜索列表的最快方法【英文标题】:Fastest way to search a list in python 【发布时间】:2011-08-25 00:24:35 【问题描述】:当您执行"test" in a
之类的操作时,其中a
是一个列表,python 是在列表上进行顺序搜索还是创建哈希表表示来优化查找?在应用程序中,我需要这个,因为我将在列表中进行大量查找,所以最好先执行b = set(a)
然后"test" in b
之类的操作?另请注意,我将拥有的值列表不会有重复的数据,而且我实际上并不关心它的顺序;我只需要能够检查一个值是否存在。
【问题讨论】:
【参考方案1】:还要注意,我将拥有的值列表不会有重复的数据,而且我实际上并不关心它的顺序;我只需要能够检查一个值是否存在。
不要使用列表,而是使用set()
。它具有您想要的特性,包括超快的in
测试。
我已经看到在将一个列表更改为一组的地方(主要是繁重的数字运算)加速了 20 倍甚至更高。
【讨论】:
@blcArmadillo: `set's 是要走的路,因为你没有重复的数据,也不关心顺序——而且你总是可以枚举 set 的成员或快速将其转换为如果需要,可以列出一份清单。 我用过这个,它花了很多钱。谢谢。 哇,我有一个愚蠢的脚本暴力破解两个文件以查找相似的行,这只是将时间从约 20 分钟缩短到 1 分钟以下。谢谢! 列表非常大,检查将近 200 万次,计算时间从 3 小时缩短到 【参考方案2】:"test" in a
与列表 a
将进行线性搜索。动态设置哈希表比线性搜索要昂贵得多。另一方面,"test" in b
将执行 amoirtised O(1) 哈希查找。
在您描述的情况下,似乎没有理由使用列表而不是集合。
【讨论】:
只有在构建 b 后对它进行了许多查找时,这才是正确的。如果每次执行查找时都需要(重新)构造 b,那么"test" in b
会更慢,因为集合的构造不是线性的。
@Jamie:来自 OP:“在应用程序中,我需要这个,因为我将在列表中进行大量查找 [...]”。好像有很多查找。
我同意这是正确的解决方案 - 只是想弄清楚。【参考方案3】:
我认为使用 set 实现会更好。我知道集合有 O(1) 查找时间。我认为列表需要 O(n) 查找时间。但即使列表也是 O(1) 查找,切换到集合也不会丢失任何内容。
此外,集合不允许重复值。这也将使您的程序的内存效率稍高一些
【讨论】:
【参考方案4】:列表和元组似乎有相同的时间,对于大数据使用“in”很慢:
>>> 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
【讨论】:
列表必须先排序。以上是关于在python中搜索列表的最快方法的主要内容,如果未能解决你的问题,请参考以下文章