我想知道 python 生成器在这个用例中的内存优势(如果有的话)。我希望读入一个必须在所有对象之间共享的大文本文件。因为它只需要使用一次,一旦列表用完,程序就会结束,所以我打算使用生成器。
我相信生成器的“保存状态”可以让它跟踪下一个要传递给调用它的对象的值是什么。我读过生成器还可以通过不立即返回所有值而是即时计算它们来节省内存使用量。如果我在这个用例中得到任何好处,我有点困惑。
示例代码:
def bufferedFetch():
while True:
buffer = open("bigfile.txt","r").read().split('\n')
for i in buffer:
yield i
Run Code Online (Sandbox Code Playgroud)
考虑到缓冲区无论如何都会读取整个“bigfile.txt”,这不会存储在生成器中,没有内存好处吗?有没有更好的方法来返回可以在所有对象之间共享的列表的下一个值?
谢谢。
在这种情况下没有。您正在通过执行将整个文件读入内存.read()。
理想情况下,您想要做的是:
def bufferedFetch():
with open("bigfile.txt","r") as f:
for line in f:
yield line
Run Code Online (Sandbox Code Playgroud)
pythonfile对象为您处理行尾(取决于系统),它的内置迭代器将通过一次简单地迭代一行(而不是将整个文件读入内存)来生成行。