【问题标题】:Python "in" operator speedPython“输入”运算符速度
【发布时间】:2013-12-12 15:36:16
【问题描述】:

in 运算符在 python 中的速度是否与可迭代的长度成正比?

所以,

len(x) #10
if(a in x): #lets say this takes time A
    pass

len(y) #10000
if(a in y): #lets say this takes time B
    pass

A > B?

【问题讨论】:

    标签: python time size in-operator


    【解决方案1】:

    in 的摘要:

    list - Average: O(n)
    set/dict - Average: O(1), Worst: O(n)
    

    更多详情请见this

    【讨论】:

    • 所以如果我需要检查字符串是否作为字典中的键存在。那么它将需要O(1)。但是如果我需要查看列表中是否存在字符串,那么 O(n) 对吗?
    • 或者即使我有一组字符串和一个字符串列表,集合中的 x 也会比列表中的 x 快吗?
    • 最坏的情况什么时候会发生?
    • 我认为当所有键在dict中具有相同的哈希值时
    • 字典和集合在 CPython 中的实现非常相似——它们都基于哈希码。最坏情况的行为从未出现在刻意设计用来激怒它的代码之外——但你需要对统计数据有一些理性的信心;-) 如果你想要激怒它,那么,例如,使用返回常量的__hash__ 方法定义您自己的类。
    【解决方案2】:

    对此没有通用答案:这取决于a 的类型,尤其是b 的类型。例如,如果b 是一个列表,那么是的,in 采用最坏情况时间O(len(b))。但是,例如,如果 b 是一个 dict 或一个集合,那么 in 会占用预期案例时间 O(1)(即恒定时间)。

    关于“Is A > B?”,您没有定义 AB。如上所述,对于您的哪个in 语句会运行得更快,没有一般答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2023-02-04
      • 1970-01-01
      • 2013-12-15
      • 2012-12-30
      相关资源
      最近更新 更多