Python的内置字典如何跟踪已插入的键?

时间:2019-01-24 16:51:01

标签: python dictionary data-structures

我了解哈希表:原则上,您将密钥的数据存储在固定大小的数组中,索引/槽由密钥的哈希指定使用。但是,Python的dict类具有方法dict.keys() ,该方法返回dict的键的列表。该列表从何而来?(此外,遍历字典会隐式地遍历其键)。


我试图自己考虑一下,并确定了以下要求:

我认为也许我们可以为每个插槽存储下一个和上一个非空插槽的索引,因此我们可以跳转到O(1)中的next / prev元素,还可以在O(1)中清除一个插槽(只需更新prev的下一个索引和next的上一个索引)。问题在于插入将在O(log n)中,因为我们必须对“下一个”索引进行二进制搜索。

我考虑过的另一种解释是,也许我们只是遍历所有插槽,而忽略空插槽,并在每次迭代键时都通过反复检查空插槽来接受运行时损失。这样做的一个缺点是,为了使哈希表高效,散列表必须很满,这会减慢插入速度。


相关问题"How are Python's Built In Dictionaries Implemented"从未提及字典的这一方面。

编辑:用于迭代的源代码似乎是here

1 个答案:

答案 0 :(得分:0)

我查看了CPython源代码here,尽管我仍然不能100%地确定我的第二个猜测是正确的:我们只是遍历所有插槽。我们将忽略空插槽,并返回非空插槽中的所有键

Python字典一旦2/3已满并且(假设没有删除)double in size,将被调整大小,之后它们将变为2/6 = 1/3满*,这意味着我们可以在O( 3n)(删除常数后为O(n)。

*:该评论似乎已过时,我认为如果使用当前常量,该评论甚至会更完整