python生成器比列表更节省内存,因列表一次性加载所有元素而生成器按需计算;生成器不可重复遍历,列表可多次使用;生成器适用于大数据流处理,列表适合随机访问;生成器函数支持yield实现状态保持与协程逻辑。

Python生成器比列表更节省内存,核心区别在于:列表一次性把所有元素存入内存,生成器则按需计算、逐个产出,不保留历史值。
内存占用差异明显
创建包含100万个整数的序列时:
- 列表:list(range(1000000)) 立即分配约8MB内存(每个int在CPython中约8字节)
- 生成器:(x for x in range(1000000)) 仅占用约100–200字节,只存状态机和当前迭代位置
生成器不能重复遍历
生成器对象是单次使用的——遍历完即耗尽,再次调用会立刻结束;列表可无限次索引、切片、循环:
- 生成器:g = (x**2 for x in range(3)); list(g) → [0,1,4]; list(g) → []
- 列表:l = [x**2 for x in range(3)]; list(l) → [0,1,4]; list(l) → [0,1,4]
适用场景不同
选列表当需要随机访问、多次使用或数据量可控;选生成器当处理大文件、流式数据、或仅需逐个处理且不回溯:
立即学习“Python免费学习笔记(深入)”;
- 读大文件每行处理:def read_large_file(f): yield from (line.strip() for line in f)
- 实时API分页拉取:def fetch_all_pages(): for page in api_pages(): yield from page["items"]
- 无需全部加载到内存的过滤/转换链:result = (x*2 for x in data if x > 10)
可显式控制生成过程
生成器函数支持yield暂停与恢复,能实现协程逻辑、状态保持或延迟初始化:
- def countdown(n): while n > 0: yield n; n -= 1 ——每次调用next()才减一
- 配合send()、throw()、close()可双向通信(进阶用法)










