当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《通过返回迭代器而不是列表来保护Py3k内存》经验,为你挑选了1个好方法。

用于在Python 2.x中返回列表的许多方法现在似乎都在Py3k中返回迭代器

迭代器也是生成器表达式吗?懒惰评价?

因此,随着这一点,python的内存占用将大幅减少.不是吗?

使用内置脚本从2to3转换的程序怎么样?

为了兼容性,内置工具是否将所有返回的迭代器显式转换为列表?如果是这样,那么Py3k的较低内存占用优势在转换后的程序中并不明显.是吗?



1> Brian..:

其中许多不完全是迭代器,而是特殊的视图对象.例如,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中的真实列表对象.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有