大家好,我是正在学习 AI 知识的一名普通学习者。最近在跟着 NLP 自然语言处理 课程打基础,一边学一边整理成掘金文章,既是学习沉淀,也希望能帮到同样入门的同学。今天整理的是:Python 生成器(generator) 。
1.为什么要学习生成器?
在学习 NLP、大模型、数据处理时,我们经常会遇到:
- 超大文本语料读取
- 逐句、逐批处理数据
- 不想一次性把所有数据加载进内存
- 训练数据迭代器(DataLoader 本质就是生成器思想)
生成器就是用来:懒加载、省内存、迭代处理数据流。 对后面学 Transformer、数据集加载、文本预处理 非常关键。
2.那什么是生成器呢?
- 生成器是 可迭代对象
- 它不会一次性把所有结果创建出来
- 用到一个,计算一个,返回一个
- 节省大量内存,特别适合大数据、NLP 语料
一句话:生成器 = 一边迭代,一边生成。
3.生成器的两种创建方式
3.1生成器表达式(简单写法)
# 列表
lst = [i for i in range(5)]
print(lst)
运行结果:
# 生成器
generator = (i for i in range(5))
print(generator) # 输出: <generator object>
运行结果:
3.2yield关键字(真正重点)
那如何让一个函数称为生成器函数呢? 函数里出现 yield,这个函数就变成生成器函数。
def my_generator():
yield 1
yield 2
yield 3
gen = my_generator()
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
运行结果:
4.生成器的执行原理
注意:
-
调用函数时,不执行代码,只创建生成器对象!
-
调用
next()时,才开始执行 -
遇到
yield暂停,并返回值 -
再次
next(),从暂停位置继续执行 -
直到没有 yield,抛出 StopIteration
总结: 调用 → 运行到 yield → 暂停 → 返回 → 再调用 → 继续运行
5.生成器常用方法
5.1next():获取下一个值
gen = (i for i in range(3))
print(next(gen))
print(next(gen))
5.2send():向生成器内部传值
def gen():
val = yield 1
print(val)
yield 2
g = gen()
print(next(g)) # 1
g.send("hello") # 把 "hello" 传给 val
5.3close():关闭生成器
gen.close()
6.生成器 vs 列表: 性能对比
import sys
# 列表
lst = [i for i in range(100000)]
print(sys.getsizeof(lst)) # 占用内存大
# 生成器
gen = (i for i in range(100000))
print(sys.getsizeof(gen)) # 占用内存极小
结论:数据量越大,生成器的优势越明显
7. NLP / 大模型里的生成器应用
- 读取超大文本语料:逐行读取,不一次性加载。
- 构建数据集迭代器:训练模型时,一批一批喂数据。
- 文本预处理 pipeline:分词 → 转索引 → 批量生成。
- Transformer 训练时的数据迭代
8. 小结
-
生成器是 惰性迭代,节省内存
-
两种创建方式:
()表达式、yield函数 -
执行流程:调用 → 运行 → yield 暂停 → 继续
-
next /send/close 是核心方法
-
NLP、大模型数据加载必备基础
备注:欢迎关注 + 点赞 + 收藏,一起从零搭建 AI 知识体系 🚀