Python Generator 内存对大量读数有好处吗?

标签 python generator

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

我相信生成器的“保存状态”可以让它跟踪要传递给调用它的任何对象的下一个值是什么。我读过生成器还通过不立即返回所有值来节省内存使用量,而是即时计算它们。不过,如果我在此用例中获得任何好处,我会感到有些困惑。

示例代码:

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

考虑到缓冲区无论如何都会读取整个“bigfile.txt”,这不会存储在生成器中,没有内存优势吗?有没有更好的方法来返回可以在所有对象之间共享的列表的下一个值?

谢谢。

最佳答案

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

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

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

python file 对象会为您处理行尾(系统相关),它的内置迭代器将通过简单地一次迭代一行来产生行时间(没有将整个文件读入内存)。

关于Python Generator 内存对大量读数有好处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24443209/

相关文章:

python - pandas.read_feather 得到了一个意想不到的参数 nthreads

python - 是否有用于访问 Advantage 数据库服务器的 Python 模块?

python - 是否可以一次调用无限 python 生成器的多个下一个值?

javascript - 由于异步生成器中的非并行等待 promise 而减速

python - 如何使用 python 将 yaml 文件作为字典读取并更新值

Python 日志记录 : dictConfig

python - 有没有更快的方法将一列 pyspark 数据框转换为 python 列表? (收集()很慢)

mysql - 在 windows7 的 yii2 中安装 mongodb 失败

python - 将yield生成器添加到python函数中

angularjs - 从 generator-gulp-angular 全栈生成的端点中删除一些文件