许多过去在 Python 2.x 中返回列表的方法现在似乎在 Py3k 中返回迭代器
迭代器也是生成器表达式吗?懒评价?
因此,Python 的内存占用将大大减少。不是吗?
使用内置脚本从 2 转换为 3 的程序又如何呢?
为了兼容性,内置工具是否显式地将所有返回的迭代器转换为列表?如果是这样,那么 Py3k 较低的内存占用优势在转换后的程序中并不明显。是吗?
其中许多并不完全是迭代器,而是特殊的视图对象。例如 range() 现在返回类似于旧 xrange 对象的东西 - 它仍然可以被索引,但根据需要延迟构造整数。
类似地, dict.keys() 给出了一个 dict_keys 对象,该对象实现了字典上的视图,而不是使用键的副本创建一个新列表。
这如何影响内存占用可能取决于程序。当然,除非您确实需要列表,否则更强调使用迭代器,而使用列表通常是 python2 中的默认情况。这将导致普通程序的内存效率可能更高。然而,真正节省大量内存的情况可能已经在 python2 程序中作为迭代器实现,因为真正大量的内存使用将会脱颖而出,并且更有可能已经得到解决。 (例如,文件迭代器的内存效率已经比旧版本高得多file.readlines()
method)
转换是由 2to3 工具完成的,通常会将 range() 之类的东西转换为迭代器,这样它就可以安全地确定不需要真正的列表,因此代码如下:
for x in range(10): print x
将切换到新的 range() 对象,不再创建列表,因此将获得减少内存的好处,但代码如下:
x = range(20)
将被转换为:
x = list(range(20))
因为转换器无法知道代码是否需要real列出 x 中的对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)