Python生成器对大型读取器的内存优势?

Python生成器对大型读取器的内存优势?,python,generator,Python,Generator,我想知道python生成器在这个用例中的内存优势(如果有的话)。我希望读入一个必须在所有对象之间共享的大文本文件。因为它只需要使用一次,一旦列表用完,程序就会完成,所以我计划使用生成器 我相信,生成器的保存状态可以让它跟踪传递给调用它的对象的下一个值。我已经读到,生成器也节省了内存使用,因为它不是一次返回所有的值,而是动态地计算它们。不过,我有点困惑,在这个用例中我是否能得到任何好处 示例代码: def bufferedFetch(): while True: buffe

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

我相信,生成器的保存状态可以让它跟踪传递给调用它的对象的下一个值。我已经读到,生成器也节省了内存使用,因为它不是一次返回所有的值,而是动态地计算它们。不过,我有点困惑,在这个用例中我是否能得到任何好处

示例代码:

def bufferedFetch():
    while True:
        buffer = open("bigfile.txt","r").read().split('\n')
        for i in buffer:    
            yield i
考虑到缓冲区将在整个bigfile.txt中读取,这不是存储在生成器中,没有内存优势吗?是否有更好的方法返回可在所有对象之间共享的列表的下一个值


谢谢

在本例中,不是。您正在通过do.read将整个文件读入内存

理想情况下,您想做的是:

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

python file对象负责系统相关的行结束,它的内置迭代器只需一次迭代一行即可生成行,而不是将整个文件读入内存。

在这种情况下,否。您通过执行.read将整个文件读入内存

理想情况下,您想做的是:

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

python file对象负责处理依赖于系统的行结束,它的内置迭代器只需一次迭代一行即可生成行,而不必将整个文件读入内存。

。非常感谢,太棒了。非常感谢你。