You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python生成器内存解析:实例b的内存实际存储了什么?

生成器实例的内存存储解析

我之前看到一篇解释Python中yield关键字的优质帖子,随后自己做了些探索:生成器的内存占用远小于列表这类可迭代对象,但仍会占用少量内存。

更有意思的是,当我把range(100)改成range(10000),甚至在生成器函数里添加中间变量(比如test = i * 100 + 2再yield test)时,生成器实例b的内存占用始终维持112字节,而列表a的内存占用则会随元素数量增加而增长。这是不是说明生成器的内存占用和它延迟执行的函数规模无关?

我的测试代码如下:

from sys import getsizeof

a = [i for i in range(100)]

def b(): 
    for i in range(100):
        yield i
        
b = b()

getsizeof(a) # 920
getsizeof(b) # 112

生成器实例b的内存中实际存储了什么?

生成器实例本质是一个状态机,它的内存里不会存储预先生成的元素,只保留维持其暂停/恢复执行所需的核心信息,具体包括:

  • 生成器函数的代码对象引用:指向函数的字节码、常量池等静态结构,这部分由所有同类型生成器共享,不会单独占用实例内存。
  • 当前的执行上下文:比如代码执行到的位置(程序计数器)、局部变量的当前状态(比如示例中循环变量i的当前值)、栈帧的基础信息。
  • 生成器的状态标记:记录生成器是否已启动、是否已耗尽等运行状态。

这就是为什么不管生成器要生成多少元素、函数内有多少中间变量,实例本身的内存占用都保持稳定——它只需要记住“下次从哪继续执行”和当前的局部状态,所有待生成的元素和中间变量都会在迭代(调用next())时临时创建,迭代结束后就会被垃圾回收,不会常驻在生成器实例的内存中。

内容的提问来源于stack exchange,提问作者ZooPanda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:15:34