【问题标题】:Python dictionary iterator performancePython字典迭代器性能
【发布时间】:2015-09-21 17:42:59
【问题描述】:

在 Python 中使用字典时,this page 表示遍历字典元素的时间复杂度为 O(n),其中 n 是字典的最大大小。

但是,我认为没有明显的方法可以遍历哈希表的元素。在遍历哈希表的元素时,我是否可以假设 dict.iteritems() 的性能良好,而没有太多开销?

由于字典在 Python 中被大量使用,我假设这是以某种巧妙的方式实现的。不过,我需要确定一下。

【问题讨论】:

  • 你到底在问什么?如果您对字典的实现方式感兴趣,请查看"the mighty dictionary"。
  • 目前尚不清楚您正在寻找什么类型的答案。您可以假设性能良好,直到它对您的需求来说太慢。
  • 哈希表只不过是一个数组,由哈希值索引。迭代元素并不难。

标签: python performance time-complexity python-internals


【解决方案1】:

如果你看notes on Python's dictionary source code,我认为相关点如下:

这些方法(迭代和键列表)循环遍历每个潜在条目

将有多少潜在条目,作为最大尺寸(该字典中存储的最大键数)的函数?查看同一文档中的以下两个部分:

PyDict_SetItem 中的最大字典负载。当前设置为 2/3

达到最大负载时的增长率。当前设置为 *2。

这表明字典的稀疏度将在 1/3~2/3 左右(除非增长率设置为 *4,否则为 1/6~2/3)。所以基本上你要为每个键检查多达 3 个(如果 *4 则为 6 个)潜在条目。

当然,无论是 3 个条目还是 1000 个条目,它仍然是 O(n),但 3 似乎是一个可以接受的常数因子。

顺便说一下,这里是其余的源代码和文档,包括 DictObject 的:

http://svn.python.org/projects/python/trunk/Objects/

【讨论】:

  • 谢谢,这正是我想要的!
猜你喜欢
  • 2018-10-26
  • 1970-01-01
  • 2013-08-21
  • 2013-12-03
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
相关资源
最近更新 更多