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
相关产品推荐
相关产品推荐

