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

一句话总结区别

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

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


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. 处理百万/千万级数据一定要用生成器,不然程序会卡死。

相关推荐
vx-程序开发13 分钟前
springboot农产品运输服务平台---附源码75498
java·javascript·spring boot·python·eclipse·django·php
Dxy12393102161 小时前
python 中的 APScheduler 使用详解
开发语言·python
染指11101 小时前
76.高级RAG-后检索器(时间排序)
人工智能·python·llama_index·llamaindex
weixin_440784112 小时前
Java基础常见题
java·开发语言·python·java基础
跨境小彭3 小时前
Python列表去重的6种高效方法(含保留顺序+性能对比)
开发语言·python
今天AI了吗3 小时前
Python 基础语法从入门到使用详解
开发语言·人工智能·python
苏灿烤鱼3 小时前
从微信公众号内容到视频号视频:自动化视频生成的技术实现
人工智能·python·ffmpeg
金銀銅鐵3 小时前
[Python] 借助 Pillow 和 NumPy 生成与斐波那契数列有关的图案
python·数学
雪之下雪乃的代码日记3 小时前
Python快速入门(Java开发者版)
java·开发语言·笔记·python
gb42152874 小时前
python中pypdf库和langchain-unstructured库在解析pdf文件的时候的区别?
python·langchain·pdf