Python 是不是优化了引擎盖下的字典查找?

Posted

技术标签:

【中文标题】Python 是不是优化了引擎盖下的字典查找?【英文标题】:Does Python optimize dictionary lookups under the hood?Python 是否优化了引擎盖下的字典查找? 【发布时间】:2015-01-14 19:29:24 【问题描述】:

例如:

d = "John": "Doe", "Paul": "Allen", "Bill": "Gates"

想象一下,这有几千/百万个这样的名字,所有名字都是唯一的。

如果我想查看密钥“Paul”是否存在,它在幕后做了什么?

【问题讨论】:

python 字典是hashmaps 【参考方案1】:

Python 的字典实现通过要求键对象提供“哈希”函数将字典查找的平均复杂度降低到 O(1)。这样的散列函数获取关键对象中的信息并使用它来生成一个整数,称为散列值。然后使用这个哈希值来确定这个(键,值)对应该放在哪个“桶”中。此查找函数的伪代码可能类似于:

def lookup(d, key):
    '''dictionary lookup is done in three steps:
       1. A hash value of the key is computed using a hash function.

       2. The hash value addresses a location in d.data which is
          supposed to be an array of "buckets" or "collision lists"
          which contain the (key,value) pairs.

       3. The collision list addressed by the hash value is searched
         sequentially until a pair is found with pair[0] == key. The
         return value of the lookup is then pair[1].
   '''
   h = hash(key)                  # step 1
   cl = d.data[h]                 # step 2
   for pair in cl:                # step 3
       if key == pair[0]:
           return pair[1]
   else:
       raise KeyError, "Key %s not found." % key

来自Python Wiki

【讨论】:

这取决于哈希表的大小相对于字典的大小,例如该表可以有 5 个条目,但您有 10 个键,这肯定会导致冲突(因此其中包含超过 1 个值的箱)。哈希表可能会动态增长,我不知道细节。它还取决于散列算法的好坏。同样,我不熟悉 Python 中的实现细节。 Python 哈希表确实是动态增长的(类似于 Python 数组),它们通过检查命中是否相等来容忍冲突,并且在不匹配时,以鼓励平等分布的特定顺序使用下一个可用空间。 @AndrewGorcester 感谢您提供详细信息!【参考方案2】:

Python 字典是用哈希表实现的。所以平均 O(1) 查找(取决于散列函数的强度)。

参考资料:

Is a Python dictionary an example of a hash table?

【讨论】:

O(1) 平均,不是最坏的情况。 @shx2 通常,如果您进行了足够多的查找以使其重要,则平均情况占主导地位。除非您有可能遭到拒绝服务攻击。 @MarkRansom:除了最坏的情况,还可以假设一个糟糕的哈希算法。 @BillLynch:散列不是问题,冲突才是。 Python 在字典中添加了一个随机种子,以防御一类 DOS 攻击,这些攻击会通过创建专门设计为始终冲突的字符串值来利用最坏的情况。例如,发送其中的 10000 个以占用 Web 服务器。 @BillLynch 你的意思是类似于这个随机数生成器的散列算法? dilbert.com/strips/comic/2001-10-25

以上是关于Python 是不是优化了引擎盖下的字典查找?的主要内容,如果未能解决你的问题,请参考以下文章

python 性能优化技巧

V8 JavaScript引擎研究高性能探秘

使用 dict.items() 为大型数据集优化字典查找

Node.js背后的V8引擎优化技术

ClickHouse 在 UBA 系统中的字典编码优化实践

Node.js背后的V8引擎优化技术