【问题标题】:"in" operation on sets and lists in Python [duplicate]Python中集合和列表的“in”操作[重复]
【发布时间】:2021-11-18 23:21:42
【问题描述】:

我有一本关于 Python 的书说:

in 是一个非常快速的集合操作:

stopwords_list = ["a", "an"] + hundreds_of_other_words + ["yet", "you"]
"zip" in stopwords_list # False, but have to check every element
stopwords_set = set(stopwords_list)
"zip" in stopwords_set # Very fast to check

我有两个问题:

  1. 为什么in 在集合上比在列表上更快?
  2. 如果in 运算符在集合上确实更快,那么为什么Python 的制造者不重写in 列表的方法来执行x in set(list)?为什么这本书中的想法不能成为语言的一部分?

【问题讨论】:

  • 因为从列表中创建set 会消耗 CPU
  • 还因为不是所有可以放在列表中的东西都可以放在集合中。
  • 效率方面x in set(list)x in list是一样的。两者都是线性运算。

标签: python


【解决方案1】:

set 使用哈希表来获得平均 O(1) 查找,而不是使用列表查找 O(n),这就是它更快的原因,前提是元素是可哈希的(阅读更多:What makes sets faster than lists?)。

现在在调用in 时将list 转换为set 需要解析完整列表并转换为set,因此在列表中搜索甚至更慢(即使元素位于列表的开头,所有元素都进行了转换,因此没有短路)。

没有魔法。将list 转换为set 很有用,但仅在初始化阶段,然后在处理过程中多次在set 中进行查找。

但在这种情况下,直接创建set 是最好的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    相关资源
    最近更新 更多