← 全部文章

技术与生活 / 一篇记录

生成器节约内存的代价是什么?

生成器按需产生值,适合不必一次放进内存的处理流程。

生成器保留执行状态,消费到下一项时才继续运行。它适合流水线,但不提供列表那样的任意索引和天然重复遍历,某些错误也会延后到消费阶段出现。

从一个例子看起

以下示例使用 Python 3,文件路径和输入值均为练习样本。

def rows():
    for n in range(3):
        yield n
print(list(rows()))

消费一次后再次迭代同一生成器,观察结果。

排查时再往前走一步

先确认调用方是需要一次遍历还是反复访问。调试时随手把生成器打印成列表,会提前消费全部结果,也可能让后续代码得到空序列。

生成器内部打开资源时,还应考虑调用者提前停止遍历的情况。资源生命周期与消费过程绑定,不能简单假定每个调用方都会读到最后一条数据再退出。

生成器通常只能向前消费,不能当作可重复访问的列表。

参考:Python 文档。

搜索文章

输入关键词,找回一篇记录。