日常编程中,我们常常会一次性生成并处理整个数据集合。但面对大数据或无限序列时,这种方式会带来明显的内存压力。生成器通过惰性计算,只在需要时才产生下一个值,让程序更节制地使用资源。

为什么需要惰性计算

普通列表在创建时就把全部元素放入内存。如果数据量很大,这部分开销可能很可观。生成器保存的不是完整结果,而是“如何得到下一个结果”的执行状态,因此特别适合读取大文件、消费数据流或构造无限序列。

yield 如何改变执行流程

函数中出现 yield 后,调用它不会立即执行完整函数,而会返回一个生成器对象。每次调用 next(),函数从上次暂停的位置继续,产生一个值后再次暂停。局部变量和执行位置都会被保留下来。

一个实际例子

下面这个生成器按顺序产生斐波那契数,但不会提前创建完整列表:

def fibonacci(n):
    a, b = 0, 1
    count = 0
    while count < n:
        yield a
        a, b = b, a + b
        count += 1

调用 fibonacci(10) 时,结果按需逐个产生。若处理对象换成长达数 GB 的日志文件,这种差异会直接决定程序能否稳定运行。

写在最后

生成器并不总比列表更好:结果需要反复访问时,列表往往更方便。但当数据只需顺序消费一次,或者数据本身无法一次装入内存时,生成器通常是更清晰、更稳妥的选择。