许多用于在 Python 2.x 中返回列表的方法现在似乎在 Py3k 中返回迭代器
迭代器也是生成器表达式吗?惰性评估?
因此,python 的内存占用将大大减少。不是吗?
对于使用内置脚本从 2to3 转换的程序呢?
为了兼容性,内置工具是否明确地将所有返回的迭代器转换为列表?如果是这样,那么 Py3k 较低的内存占用优势在转换后的程序中并不是很明显。是吗?
最佳答案
其中很多不完全是迭代器,而是特殊的 View 对象。例如 range() 现在返回类似于旧的 xrange 对象的东西——它仍然可以被索引,但会根据需要延迟构造整数。
类似地,dict.keys() 给出了一个 dict_keys 对象来实现字典的 View ,而不是创建一个包含键副本的新列表。
这如何影响内存占用可能取决于程序。当然,除非你真的需要列表,否则更强调使用迭代器,而使用列表通常是 python2 中的默认情况。这将导致普通程序的内存效率可能更高。然而,真正节省大量资金的情况可能已经在 python2 程序中作为迭代器实现,因为真正大的内存使用量会很突出,而且更有可能已经得到解决。 (例如,文件迭代器的内存效率已经比旧的 file.readlines()
方法高得多)
转换由 2to3 工具完成,通常会将 range() 之类的东西转换为迭代器,它可以安全地确定不需要真正的列表,因此代码如下:
for x in range(10): print x
将切换到新的 range() 对象,不再创建列表,因此将获得减少内存的好处,但代码如下:
x = range(20)
将转换为:
x = list(range(20))
因为转换器不知道代码是否需要 x 中的真实列表对象。
关于python - 通过返回迭代器而不是列表来保存 Py3k 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/701088/