生成器不保存全部结果而list一次性加载所有元素到内存。生成器仅存储逻辑和状态,内存占用极小;列表则需分配空间存储全部计算结果,如百万级数据可占8mb以上。

generator 不保存全部结果,list 会一次性把所有元素塞进内存——这是最直接的答案。
生成器对象本身几乎不占内存
当你写 (x * x for x in range(10**6)),Python 只创建一个 generator 对象,通常几十字节。它不计算任何值,也不存数字,只记住了“待执行的逻辑”和当前状态。
而 [x * x for x in range(10**6)] 会立刻分配内存、构造一百万个整数、装进列表——实测常占用 ~8MB+(取决于 Python 版本和整数缓存机制)。
- 生成器对象大小可用
sys.getsizeof(g)验证,通常 - 列表大小随元素数量线性增长,
sys.getsizeof(lst)会明显跳升 - 哪怕你只用前 3 个值,
list还是全量加载;generator真的只算前 3 个
yield 函数每次只产出一个值,且不保留上下文以外的数据
函数里用 yield,不是返回后就结束,而是“暂停 + 记住位置”。下次调用 next() 或进入 for 循环下一轮时,才从暂停处继续执行,算出下一个值,然后再次暂停。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 局部变量(如循环变量
i)在 yield 后仍存在,但其他中间结果不会累积 - 没有额外容器存储历史产出项,上一个值用完即丢(除非你手动存下来)
- 对比
return函数:必须收集全部结果到一个结构(如list)再返回,无法回避内存峰值
多次迭代生成器会失效,而 list 始终可重复遍历
这是省内存的代价之一:generator 是单次消费的。一旦你用 for 遍历完,或调用 list(g) 强制展开,它就耗尽了。再遍历会得到空结果,不是报错,而是默默不产出任何东西。
- 常见错误:
for x in g: ...之后又写一遍同样循环 → 第二遍什么也不做 - 若需多次使用,必须重新调用生成器函数(如
data_gen()),而不是复用同一个g -
list没这个问题,但它为此付出的是内存常驻成本
大文件读取、无限序列、pipeline 场景下,list 根本不可行
当数据源远超内存容量(比如读取 10GB 日志、生成斐波那契无穷序列、逐行处理 CSV 流),list 直接触发 MemoryError。而 generator 可以稳定运行,只要单次处理逻辑不爆内存。
- 典型模式:
def read_large_file(f): for line in f: yield line.strip() - 流水线组合:
filter(..., map(..., parse_log_lines(file))),每个环节都是 generator,全程零中间列表 - 一旦你用
list(...)包裹任意一环,整条 pipeline 的内存优势就崩塌
真正容易被忽略的点是:生成器省的不只是“最终结果”的内存,更是所有中间态的累积内存。你在写 map、filter、itertools.chain 时,如果底层是 generator,它们也返回 generator;一旦混入一个 list 或 tuple,整条链就提前 materialize 了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










