一句话总结区别
推导式(列表/字典/集合):一次性把所有数据造好,占内存。
生成器表达式:不提前造数据,用一个造一个,超级省内存。
1. 符号不同(一眼区分)
python
# 列表推导式
[x for x in range(10)] # [] → 列表
# 字典推导式
{x:x*2 for x in range(10)} # {} → 字典
# 集合推导式
{x for x in [1,2,2,3]} # {} → 集合
# 生成器表达式
(x for x in range(10)) # () → 生成器
2. 执行方式完全不同(最重要!)
✅ 推导式:立即执行,全部生成
你写出来那一刻,所有数据已经在内存里了。
python
nums = [x for x in range(1000000)]
# 100万个数字瞬间生成 → 占内存
✅ 生成器表达式:惰性执行,用到才生成
你写出来那一刻,一个数据都没生成 !
只有你去遍历/取数时,它才生成一个,用完就丢。
python
nums = (x for x in range(1000000))
# 不占内存!只有调用 next() 或 for 循环才生成
3. 内存占用天差地别
推导式
数据量越大,占内存越多。
100万条数据 = 100万条同时存在内存里。
生成器
无论多少数据,永远只占一点点内存 。
因为它不存储数据,只存储生成数据的规则。
4. 能不能重复使用?
推导式:可以反复用
python
lst = [1,2,3,4]
print(list(lst)) # [1,2,3,4]
print(list(lst)) # [1,2,3,4]
生成器:只能用一次!(大坑)
python
gen = (x for x in range(4))
print(list(gen)) # [0,1,2,3]
print(list(gen)) # [] 空了!耗尽了!
5. 速度对比
- 推导式:创建慢一点,读取快
- 生成器:创建极快,读取逐个来
终极对比表(最好记)
| 特性 | 推导式(列表/字典/集合) | 生成器表达式 |
|---|---|---|
| 符号 | [] {} |
() |
| 生成方式 | 一次性全部生成 | 惰性生成(用一个造一个) |
| 内存占用 | 高 | 极低 |
| 可迭代次数 | 无限次 | 只能迭代一次 |
| 支持方法 | 所有列表/字典/集合方法 | 只能迭代、next() |
| 使用场景 | 数据量小、需要反复使用 | 数据量大、只遍历一次 |
最简单的记忆口诀
小数据、要复用 → 用推导式
大数据、省内存 → 用生成器
总结
- 推导式 是容器,装着所有数据。
- 生成器 是工厂,只生产,不存货。
- 生成器只能用一次,推导式可以无限用。
- 处理百万/千万级数据一定要用生成器,不然程序会卡死。