【NLP 前置基础】Python 生成器 generator 超详细讲解

4 阅读3分钟

大家好,我是正在学习 AI 知识的一名普通学习者。最近在跟着 NLP 自然语言处理 课程打基础,一边学一边整理成掘金文章,既是学习沉淀,也希望能帮到同样入门的同学。今天整理的是:Python 生成器(generator)

1.为什么要学习生成器?

在学习 NLP、大模型、数据处理时,我们经常会遇到:

  • 超大文本语料读取
  • 逐句、逐批处理数据
  • 不想一次性把所有数据加载进内存
  • 训练数据迭代器(DataLoader 本质就是生成器思想)

生成器就是用来:懒加载、省内存、迭代处理数据流。 对后面学 Transformer、数据集加载、文本预处理 非常关键。

2.那什么是生成器呢?

  • 生成器是 可迭代对象
  • 不会一次性把所有结果创建出来
  • 用到一个,计算一个,返回一个
  • 节省大量内存,特别适合大数据、NLP 语料

一句话:生成器 = 一边迭代,一边生成。

3.生成器的两种创建方式

3.1生成器表达式(简单写法)

# 列表
lst = [i for i in range(5)]
print(lst)

运行结果:

image.png

# 生成器
generator = (i for i in range(5))
print(generator) # 输出: <generator object>

运行结果: image.png

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

运行结果:

image.png

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 / 大模型里的生成器应用

  1. 读取超大文本语料:逐行读取,不一次性加载。
  2. 构建数据集迭代器:训练模型时,一批一批喂数据。
  3. 文本预处理 pipeline:分词 → 转索引 → 批量生成。
  4. Transformer 训练时的数据迭代

8. 小结

  • 生成器是 惰性迭代,节省内存

  • 两种创建方式:() 表达式、yield 函数

  • 执行流程:调用 → 运行 → yield 暂停 → 继续

  • next /send/close 是核心方法

  • NLP、大模型数据加载必备基础

备注:欢迎关注 + 点赞 + 收藏,一起从零搭建 AI 知识体系 🚀