【一分钟快学】掌握 Python 生成器:使用 Yield 释放内存和性能的秘密武器

在 Python 中,yield 表达式是一种非常强大的特性,允许一个函数一次返回一个值,并在下一次调用时从上次返回的位置继续执行。这种函数称为生成器 。使用 yield 可以使代码更加内存高效,特别是当你需要迭代大量数据时。这是因为它不需要在迭代开始之前在内存中存储整个数据集。

如何使用 yield

基本用法

使用 yield 的函数会返回一个迭代器,每次迭代会返回一个值。

python 复制代码
def simple_generator():
    yield 1
    yield 2
    yield 3

# 使用生成器
for value in simple_generator():
    print(value)

使用场景

当处理大型数据集时,例如从文件逐行读取数据或从数据库逐行读取记录,使用 yield 可以极大地减少内存使用。

python 复制代码
def read_large_file(file_name):
    with open(file_name, 'r') as file:
        for line in file:
            yield line.strip()  # 去除换行符,逐行返回

# 逐行处理文件
for line in read_large_file('large_file.txt'):
    print(line)

注意点

  1. 状态保持 :生成器函数在每次 yield 后暂停执行,并在下一次迭代时从上次离开的地方继续执行。
  2. 只能遍历一次:生成器是一次性的,只能遍历一次。如果需要再次遍历,你需要重新创建生成器实例。
  3. 性能考虑 :虽然 yield 可以减少内存使用,但如果需要频繁访问数据或在多个地方使用数据,将所有数据加载到内存中可能更高效。
  4. 异常处理 :在生成器中处理异常需要注意,因为一旦生成器开始执行,它就会在 yield 处暂停,这可能会使异常处理变得复杂。

高级用法:生成器表达式

生成器表达式提供了一种更简洁的方式来创建生成器,类似于列表推导,但使用圆括号。

python 复制代码
# 生成器表达式
squares = (x*x for x in range(10))

for square in squares:
    print(square)

结合 yield 使用的 send() 方法

生成器不仅可以产出值,还可以通过 send() 方法接收外部传入的值,这为生成器与外界的交互提供了更大的灵活性。

python 复制代码
def counter():
    n = 0
    while True:
        received = yield n
        if received is not None:
            n = received
        else:
            n += 1

c = counter()
print(next(c))  # 输出 0
print(next(c))  # 输出 1
print(c.send(10))  # 输出 10

通过掌握 yield 的使用,你可以编写更加高效和灵活的 Python 代码,特别是在处理大数据集、流数据或需要协程的场景中。

相关推荐
七月shi人15 分钟前
【AI编程工具IDE/CLI/插件专栏】- 热门AI编程CLI初识与IDE对比
ide·人工智能·ai·ai编程
AI_RSER29 分钟前
第一篇:【Python-geemap教程(三)上】3D地形渲染与Landsat NDVI计算
开发语言·python·3d·信息可视化·遥感·gee
wow_DG41 分钟前
【Pytorch✨】LSTM01 入门
人工智能·pytorch·lstm
不会计算机的g_c__b1 小时前
搜索引擎评估革命:用户行为模型如何颠覆传统指标?
人工智能·自然语言处理·机器翻译
WSSWWWSSW1 小时前
Python编程基础与实践:Python循环结构基础
开发语言·python
im_AMBER1 小时前
学习日志25 python
开发语言·python·学习
萑澈1 小时前
大语言模型提示词工程详尽实战指南
人工智能·语言模型·自然语言处理
AntBlack1 小时前
闲谈 :AI 生成视频哪家强 ,掘友们有没有推荐的工具?
前端·后端·aigc
Blossom.1182 小时前
基于深度学习的医学图像分析:使用DeepLabv3+实现医学图像分割
人工智能·python·深度学习·yolo·目标检测·机器学习·迁移学习
808&Heartbreak*2 小时前
CNN实战项目
人工智能·神经网络·cnn