【问题标题】:Python: faster alternatives to searching if an item is "in" a listPython:搜索项目是否在列表“中”的更快替代方法
【发布时间】:2016-12-29 13:20:30
【问题描述】:

我有一个大约 30 个花车的列表。我想看看我的列表中是否有特定的浮点数。例如:

1 >> # For the example below my list has integers, not floats
2 >> list_a = range(30)
3 >> 5.5 in list_a
False
4 >> 1 in list_a
True

我的代码中的瓶颈是第 3 行。我多次搜索列表中是否有一个项目,我需要一个更快的替代方案。这个瓶颈占用了我 99% 以上的时间。

我可以通过将list_a 设为集合而不是列表来加速我的代码。还有其他方法可以显着加快这条线的速度吗?

【问题讨论】:

标签: python list optimization set


【解决方案1】:

如果列表未排序,检查元素是否在列表中的最佳时间是 O(n),因为该元素可能在任何地方,您需要查看每个项目并检查它是否是您要查找的内容

如果数组已排序,您可以使用二进制搜索来获得 O(log n) 查找时间。您还可以使用哈希映射来获得平均 O(1) 查找时间(或者您可以使用内置集合,它基本上是一个完成相同任务的字典)。

不过,这对于长度为 30 的列表没有多大意义。

【讨论】:

  • 我是反对者之一。我的理由是: 1. 内置的set 与搜索树完全不同,它是一个具有O(1) 摊销搜索复杂度的哈希表,而搜索树通常具有O(log(n)); 2. 你的帖子充其量只是评论。
  • @EliKorvigo 我同意理由 1,但关于评论的事情我不分享。这个答案没有显示代码,可能很短,但提到了很多重要的东西(下限、基于排序的搜索、渐近复杂度和实际执行时间之间的差异(短名单))。
  • 您为什么不编辑您的帖子以删除错误信息?
  • @DmitryTorba 又错了,set 的实现不是基于dict,阅读源代码。
【解决方案2】:

根据我的经验,当我们在长列表中搜索某些内容时,Python 确实会放慢速度。

为了补充上面的建议,我的建议是对列表进行子集化,当然,前提是列表可以是子集并且可以轻松地将查询分配给正确的子集。

示例是在英语词典中搜索一个单词,首先根据每个单词的首字母将词典分成 26 个“ABCD”部分。如果查询的是“apple”,则只需要搜索“A”部分。这样做的好处是大大限制了搜索空间,从而提高了速度。

对于数字列表,可以根据范围或第一个数字对其进行子集。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2017-05-11
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多