Py3k 通过返回迭代器而不是列表来节省内存

2024-01-06

许多过去在 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(使用前将#替换为@)

Py3k 通过返回迭代器而不是列表来节省内存 的相关文章

随机推荐