python - 通过返回迭代器而不是列表来保存 Py3k 内存

标签 python memory list iterator python-3.x

许多用于在 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/

相关文章:

python - PySide 中的样式表不起作用

python - (python)在函数中使用装饰器进行彩色打印

python - 有效地识别字符串的一部分是否在列表/字典键中?

r - 就地删除列表元素

python - sqlalchemy session 执行搞乱了有效的 postgres 语法

python - Spark统计函数Python

java字节数组内存未释放

c - 如何保护Linux中进程间共享的内存

我可以不断地malloc内存而不释放内存吗?

R:循环检查所有应用响应以创建虚拟指标