技术与生活 / 一篇记录
生成器节约内存的代价是什么?
生成器按需产生值,适合不必一次放进内存的处理流程。
生成器保留执行状态,消费到下一项时才继续运行。它适合流水线,但不提供列表那样的任意索引和天然重复遍历,某些错误也会延后到消费阶段出现。
从一个例子看起
以下示例使用 Python 3,文件路径和输入值均为练习样本。
def rows():
for n in range(3):
yield n
print(list(rows()))
消费一次后再次迭代同一生成器,观察结果。
排查时再往前走一步
先确认调用方是需要一次遍历还是反复访问。调试时随手把生成器打印成列表,会提前消费全部结果,也可能让后续代码得到空序列。
生成器内部打开资源时,还应考虑调用者提前停止遍历的情况。资源生命周期与消费过程绑定,不能简单假定每个调用方都会读到最后一条数据再退出。
生成器通常只能向前消费,不能当作可重复访问的列表。
参考:Python 文档。