Python 字典迭代器性能
Python dictionary iterator performance
When working with dictionaries in Python, this page表示遍历字典元素的时间复杂度为O(n)
,其中n
最大词典的大小。
但是,我认为没有明显的方法可以遍历散列的元素 table。在遍历散列 table 的元素时,我可以假设 dict.iteritems()
的良好性能而没有太多开销吗?
由于词典在 Python 中被大量使用,我认为这是以某种巧妙的方式实现的。不过,我需要确定一下。
如果你看notes on Python's dictionary source code,我认为相关的要点如下:
Those methods (iteration and key listing) loop over every potential entry
将有多少个潜在条目,作为最大大小的函数(曾经存储在该字典中的最大键数)?查看同一文档中的以下两个部分:
Maximum dictionary load in PyDict_SetItem. Currently set to 2/3
Growth rate upon hitting maximum load. Currently set to *2.
这表明字典的稀疏度将在 1/3~2/3 左右(除非增长率设置为 *4,否则为 1/6~2/3)。所以基本上你将为每个键检查最多 3 个(如果 *4 则为 6 个)潜在条目。
当然,无论是 3 个条目还是 1000 个条目,它仍然是 O(n),但 3 似乎是一个相当可接受的常数。
顺便提一下,这里是其余的源代码和文档,包括 DictObject 的源代码和文档:
When working with dictionaries in Python, this page表示遍历字典元素的时间复杂度为O(n)
,其中n
最大词典的大小。
但是,我认为没有明显的方法可以遍历散列的元素 table。在遍历散列 table 的元素时,我可以假设 dict.iteritems()
的良好性能而没有太多开销吗?
由于词典在 Python 中被大量使用,我认为这是以某种巧妙的方式实现的。不过,我需要确定一下。
如果你看notes on Python's dictionary source code,我认为相关的要点如下:
Those methods (iteration and key listing) loop over every potential entry
将有多少个潜在条目,作为最大大小的函数(曾经存储在该字典中的最大键数)?查看同一文档中的以下两个部分:
Maximum dictionary load in PyDict_SetItem. Currently set to 2/3
Growth rate upon hitting maximum load. Currently set to *2.
这表明字典的稀疏度将在 1/3~2/3 左右(除非增长率设置为 *4,否则为 1/6~2/3)。所以基本上你将为每个键检查最多 3 个(如果 *4 则为 6 个)潜在条目。
当然,无论是 3 个条目还是 1000 个条目,它仍然是 O(n),但 3 似乎是一个相当可接受的常数。
顺便提一下,这里是其余的源代码和文档,包括 DictObject 的源代码和文档: