在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中搜索列表的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

计算 Python 列表中出现次数的最快方法

从 Python 列表中删除列表子集的最快方法

python 获得列表中每个元素出现次数的最快方法

Java中最快的子字符串搜索方法是啥

以大于 Python 列表中的值的最小差值对大多数数字进行采样的最快方法

创建批处理并将函数应用于python列表的内存高效且最快的方法