0x5*_*539 3 python dictionary iterable memory-efficient python-3.x
在Python 3中,许多返回列表的函数(现在是类)现在返回iterables,最常见的例子是range.在这种情况下,范围在Python 3中是可迭代的,以提高性能和内存效率(因为您不必再构建列表).
其他"新" iterables是map,enumerate,zip和字典操作的输出dict.keys(),dict.values()和dict.items().(可能还有更多,但我不知道).
他们中的一些(enumerate和map)通过将它们转换为迭代可能变得更有效.在Python 2.7中,其他人只是创建了已经在内存中的对象列表,因此它们可以提高内存效率.
为什么然后将它们变成可以在每次要对它们进行排序时必须转换为列表的迭代,等等?
几个原因:
字典操作现在返回字典视图对象 ; 这些也可以作为集合,为您提供更丰富的对象,以便在您的代码中使用.在Python 2中,您必须使用这些dict.view*()方法来执行相同的操作.
Python 2中的字典操作产生了一个新的列表对象; 即使索引引用现有对象,列表对象也会占用内存.这里还有另一个副作用; 列表索引会增加所有这些字典内容的引用计数,这也会影响性能(并且可能会刷新CPU缓存).
zip()并且map()可以始终处理任何迭代,包括生成器,但是在应用时会将所有内容都拉到一个大的列表中.通过在Python 3中将它们转换为生成器,它们不再自动消耗这样的迭代.
请注意,enumerate()在Python 2中从未返回过列表,它总是返回一个迭代器.
只需应用list()这些对象,就可以始终获得旧的Python 2行为.如果你需要排序的项目,你可以调用sorted()iterable.但是你现在可以选择而不是强制列表对象.
对于Python中的大多数用例,您从未真正需要一个完整的列表.您通常会迭代这些结果.对它们进行排序不是最常见的用例,索引它们也不是.因此,对于大多数用例而言,更改是一种胜利,为程序员提供了工具,可以使用标准函数和类型生成更高效的代码.
| 归档时间: |
|
| 查看次数: |
1214 次 |
| 最近记录: |