【问题标题】:Fastest way to search a list in python在python中搜索列表的最快方法
【发布时间】:2011-08-25 00:24:35
【问题描述】:

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

【问题讨论】:

    标签: python list search find set


    【解决方案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
      

      【讨论】:

      • 列表必须先排序。
      猜你喜欢
      • 1970-01-01
      • 2012-05-23
      • 2016-04-03
      • 2012-08-05
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 2014-10-18
      相关资源
      最近更新 更多