为了回答你的问题,我们应该首先挖掘一些关于如何以及何时的信息iteritems()
已添加到 API 中。
The iteritems() https://docs.python.org/2/library/stdtypes.html#dict.iteritems方法
在Python2.2中引入后添加迭代器 http://legacy.python.org/dev/peps/pep-0234/ and 发电机 https://docs.python.org/3/whatsnew/2.2.html#pep-255-simple-generators在语言中(另见:dict.items() 和 dict.iteritems() 有什么区别? https://stackoverflow.com/questions/10458437/python-what-is-the-difference-between-dict-items-and-dict-iteritems)。事实上,该方法在 PEP 234 中明确提及。因此,它被引入作为现有方法的惰性替代方案items() https://docs.python.org/2/library/stdtypes.html#dict.items.
这遵循与以下相同的模式file.xreadlines() https://docs.python.org/2/library/stdtypes.html#file.xreadlines versus file.readlines() https://docs.python.org/2/library/stdtypes.html#file.readlines它是在 Python 2.1 中引入的(顺便说一下,在 python2.3 中已经弃用了)。
在Python 2.3中itertools
添加了模块,引入了惰性对应项map https://docs.python.org/2/library/itertools.html#itertools.imap, filter https://docs.python.org/2/library/itertools.html#itertools.ifilter etc.
换句话说,当时存在(并且仍然存在)操作懒惰的强烈趋势。原因之一是提高记忆效率。另一种是避免不必要的计算。
我找不到任何参考资料表明引入它是为了提高字典循环的速度。它只是用来替换对items()
实际上不必返回列表。请注意,这包括更多的用例,而不仅仅是简单的for
loop.
例如代码中:
function(dictionary.iteritems())
你不能简单地使用for
循环替换iteritems()
就像你的例子一样。你必须编写一个函数(或使用 genexp,即使它们在iteritems()
被引入,并且它们不会是 DRY...)。
从 a 中检索项目dict
经常这样做,所以提供一个内置方法确实有意义,事实上,有一个:items()
。问题在于items()
就是它:
- 它并不懒惰,这意味着在大的情况下调用它
dict
可能需要相当长的时间
- 它需要大量的内存。如果调用一个非常大的程序,它几乎可以使程序的内存使用量增加一倍
dict
包含大多数被操纵的对象
- 大多数时候只迭代一次
因此,在引入迭代器和生成器时,显然只需添加一个惰性对应项即可。如果您需要一个项目列表,因为您想对其建立索引或迭代多次,请使用items()
,否则你可以使用iteritems()
并避免上述问题。
使用的优点iteritems()
与使用相同items()
与手动获取值相比:
- 您编写的代码更少,这使其更加干燥并减少出错的机会
- 代码更具可读性。
再加上懒惰的优点。
正如我已经说过的,我无法重现您的性能结果。在我的机器上iteritems()
is always比迭代+按键查找更快。无论如何,差异可以忽略不计,这可能是由于操作系统处理缓存和内存的方式所致。换句话说,你关于效率的论点并不是反对(也不是赞成)使用一种或另一种替代方案的有力论据。
考虑到平均性能相同,请使用最具可读性和简洁性的替代方案:iteritems()
。这个讨论类似于问“当你可以以相同的性能按索引循环时为什么要使用 foreach?”。 foreach 的重要性不在于迭代速度更快,而在于避免编写样板代码并提高可读性。
我想指出的是iteritems()
实际上在 python3 中被删除了。这是该版本“清理”的一部分。 Python3items() https://docs.python.org/3.5/library/stdtypes.html#dict.items方法(大部分)等同于 Python 2 的viewitems() https://docs.python.org/2.7/library/stdtypes.html#dict.viewitems方法(如果我没记错的话,实际上是向后移植......)。
这个版本是惰性的(因此提供了替代品)iteritems()
)并且还具有进一步的功能,例如提供“类似集合”的操作(例如查找之间的公共项)dict
s以有效的方式等)所以在python3中使用的原因items()
而不是手动检索值更引人注目。