Python 3中的迭代器

Python 3中,许多返回列表的函数(现在是类)现在返回iterables,最常见的例子是range.在这种情况下,范围在Python 3中是可迭代的,以提高性能和内存效率(因为您不必再​​构建列表).

其他“新”迭代是map,enumerate,zip和字典操作dict.keys(),dict.values()和dict.items()的输出. (可能还有更多,但我不知道).

其中一些(枚举和映射)通过将它们转换为迭代可能变得更有效.在Python 2.7中,其他人只是创建了已经在内存中的对象列表,因此它们可以提高内存效率.

为什么然后将它们变成可以在每次要对它们进行排序时必须转换为列表的迭代,等等?

解决方法:

几个原因:

>字典操作现在返回dictionary view objects;这些也可以作为集合,为您提供更丰富的对象,以便在您的代码中使用.在Python 2中,你必须使用dict.view *()方法来做同样的事情.
> Python 2中的字典操作产生了一个新的列表对象;即使索引引用现有对象,列表对象也会占用内存.这里还有另一个副作用;列表索引会增加所有这些字典内容的引用计数,这也会影响性能(并且可能会刷新CPU缓存).
> zip()和map()可以始终适用于任何迭代,包括生成器,但在应用时会将所有内容都拉到一个大的列表中.通过在Python 3中将它们转换为生成器,它们不再自动消耗这样的迭代.

请注意,Python 2中的enumerate()从未返回过列表,它总是返回一个迭代器.

只需在这些对象上应用list(),就可以始终获得旧的Python 2行为.如果你需要排序的项目,你可以在iterable上调用sorted().但是你现在可以选择而不是强制列表对象.

对于Python中的大多数用例,您从未真正需要一个完整的列表.您通常会迭代这些结果.对它们进行排序不是最常见的用例,索引它们也不是.因此,对于大多数用例而言,更改是一种胜利,为程序员提供了仅使用标准函数和类型生成更高效代码的工具.

上一篇:Python 3:在迭代上应用运算符


下一篇:Python内置all(iterable)函数