Python Generator内存有益于大读数?

时间:2014-06-27 02:52:40

标签: python generator

我想知道python生成器在这个用例中的内存优势(如果有的话)。我希望阅读一个必须在所有对象之间共享的大型文本文件。因为它只需要使用一次,并且一旦列表耗尽程序就完成了,我计划使用生成器。

"保存状态"我相信它可以让它跟踪传递给调用它的任何对象的下一个值。我已经读过,生成器还可以通过不立即返回所有值来节省内存使用量,而是在运行时计算它们。如果我在这个用例中获得任何好处,我有点困惑。

示例代码:

def bufferedFetch():
    while True:
        buffer = open("bigfile.txt","r").read().split('\n')
        for i in buffer:    
            yield i

考虑到缓冲区将在整个" bigfile.txt"中读取。无论如何,这不会存储在发电机内,没有内存的好处吗?有没有更好的方法来返回可以在所有对象之间共享的列表的下一个值?

感谢。

1 个答案:

答案 0 :(得分:4)

在这种情况下没有。您正在通过.read()将整个文件读入内存。

您理想的做法是:

def bufferedFetch():
    with open("bigfile.txt","r") as f:
        for line in f:
            yield line

python file对象为你处理行结尾(依赖于系统的),它的内置迭代器只需迭代一行即可产生行。一段时间(没有将整个文件读入内存)。