在 Python 3 中,许多返回列表的函数(现在是类)现在都返回可迭代对象,最流行的例子是range
。在本例中,范围在 Python 3 中被设为可迭代,以提高性能和内存效率(因为您不再需要构建列表)。
其他“新”迭代是map
, enumerate
, zip
以及字典操作的输出dict.keys()
, dict.values()
and dict.items()
。 (可能还有更多,但我不知道)。
他们中有一些 (enumerate
and map
)通过将它们转换为可迭代,可能会变得更加内存高效。在Python 2.7中,其他人只是简单地创建了已经在内存中的对象列表,因此它们会节省内存。
那么为什么要将它们转换为可迭代对象,每次要对它们进行排序时都必须将其转换为列表等?
几个原因:
字典操作现在返回字典视图对象 http://docs.python.org/3/library/stdtypes.html#dictionary-view-objects;它们也充当集合,为您提供了在代码中使用的更丰富的对象。在 Python 2 中你必须使用dict.view*()
方法来做同样的事情。
Python 2 中的字典操作产生了一个新的列表对象;即使索引引用现有对象,该列表对象也会占用内存。这里还有另一个副作用;列表索引会增加所有这些字典内容的引用计数,这也会影响性能(并可能刷新 CPU 缓存)。
zip()
and map()
始终可以对任何可迭代对象(包括生成器)起作用,但在应用时会将所有内容放入一个大列表中。通过将它们转变为 Python 3 中的生成器,它们不再自动使用此类可迭代对象。
注意enumerate()
在Python 2中从不返回列表,它总是返回一个迭代器。
您始终可以通过应用来获得旧的 Python 2 行为list()
在这样的物体上。如果您需要分类的物品,您可以致电sorted()
关于可迭代的。但你现在拥有了choice而不是强加给你列表对象。
And for most在 Python 中的用例中,您从一开始就不需要真正拥有一个完整的列表。您通常会迭代这些结果。对它们进行排序不是最常见的用例,对它们进行索引也不是。因此,对于大多数用例来说,这一变化是一个胜利,它为程序员提供了仅使用标准函数和类型即可生成更高效代码的工具。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)