用于在Python 2.x中返回列表的许多方法现在似乎都在Py3k中返回迭代器
迭代器也是生成器表达式吗?懒惰评价?
因此,随着这一点,python的内存占用将大幅减少.不是吗?
使用内置脚本从2to3转换的程序怎么样?
为了兼容性,内置工具是否将所有返回的迭代器显式转换为列表?如果是这样,那么Py3k的较低内存占用优势在转换后的程序中并不明显.是吗?
其中许多不完全是迭代器,而是特殊的视图对象.例如,range()现在返回类似于旧的xrange对象的东西 - 它仍然可以被索引,但是根据需要懒惰地构造整数.
类似地,dict.keys()给出了一个dict_keys对象,它在dict上实现了一个视图,而不是创建一个带有密钥副本的新列表.
这如何影响内存占用可能取决于程序.当然,除非你真的需要列表,否则更多的重点是使用迭代器,而使用列表通常是python2中的默认情况.这将导致平均程序可能更高效.实际上有大量节省的情况可能已经在python2程序中作为迭代器实现了,但是,因为真正大的内存使用将会脱颖而出,而且更有可能已经解决.(例如,文件迭代器已经比旧file.readlines()
方法的内存效率更高)
转换是由2to3工具完成的,通常会将range()之类的东西转换为迭代器,它可以安全地确定不需要真正的列表,因此代码如下:
for x in range(10): print x
将切换到新的range()对象,不再创建列表,因此将获得减少的内存优势,但代码如下:
x = range(20)
将被转换为:
x = list(range(20))
因为转换器无法知道代码是否需要x中的真实列表对象.