推导式和生成器表达式有什么区别?

一句话总结区别

推导式(列表/字典/集合):一次性把所有数据造好,占内存。

生成器表达式:不提前造数据,用一个造一个,超级省内存。


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()
使用场景 数据量小、需要反复使用 数据量大、只遍历一次

最简单的记忆口诀

小数据、要复用 → 用推导式

大数据、省内存 → 用生成器


总结

  1. 推导式 是容器,装着所有数据。
  2. 生成器 是工厂,只生产,不存货。
  3. 生成器只能用一次,推导式可以无限用。
  4. 处理百万/千万级数据一定要用生成器,不然程序会卡死。

相关推荐
用户8356290780511 小时前
使用 Python 对 Excel 工作表进行排序
后端·python
for_ever_love__1 小时前
MySQL 全文索引实战:FULLTEXT、ngram 中文分词与 MATCH AGAINST 到底该怎么用
java·python·mysql·全文检索·分词·索引·ngram
用户8356290780511 小时前
使用 Python 合并 PowerPoint 演示文稿
后端·python
weixin_461769402 小时前
VS Code 中创建 Jupyter 文件(.ipynb)
ide·python·jupyter
2601_966949652 小时前
多市场量化策略的数据接口应该如何设计:从数据层架构到策略接入
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
全栈弄潮儿2 小时前
Python实战第1期:Python环境搭建与第一个程序
python
心易行者2 小时前
Agent应用+API端点商业化进阶实战:从单体智能体到可付费调用的API全流程
运维·服务器·人工智能·python·apache
weixin199701080162 小时前
《1688图片空间API踩坑:img.upload 与 album.* 的防盗链与CDN缓存问题》(附Python源码)
开发语言·python·缓存
布吉岛的石头3 小时前
Java 程序员第 49 阶段11:Java 接 BERT:用 ONNX Runtime 做句向量推理
java·人工智能·python·深度学习·bert·transformer
第25小时记录3 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·python