Python生成器内存占用差异疑问:为何部分生成器多占8字节?
Python生成器内存占用差异的原因
测试代码与输出
代码示例
import sys num_gen = (num for num in range(1)) print(sys.getsizeof(num_gen)) num_gen = (num for num in range(100)) print(sys.getsizeof(num_gen)) num_gen = (num+1 for num in range(100)) print(sys.getsizeof(num_gen)) num_gen = (num+1+1 for num in range(100)) print(sys.getsizeof(num_gen)) num_gen = (num+num for num in range(100)) print(sys.getsizeof(num_gen)) num_gen = (num+num+1 for num in range(100)) print(sys.getsizeof(num_gen))
运行输出
200 200 208 208 208 208
差异原因
核心原因在于生成器表达式是否需要存储自由变量:
- 前两个生成器
(num for num in range(...))中,num是生成器内部的迭代变量,不属于外部作用域的自由变量,生成器对象无需额外分配空间存储引用信息。 - 后面四个生成器的表达式(如
num+1、num+num)中,Python的字节码会将num识别为需要引用的自由变量,生成器对象必须额外分配内存来存储这个引用。在64位系统中,一个指针的大小为8字节,这就导致内存占用比前两个生成器多了8字节。
直白点说:当生成器表达式仅直接返回迭代变量时,Python会优化掉自由变量的存储逻辑;一旦表达式包含对迭代变量的运算操作,就会触发自由变量存储机制,进而增加8字节内存占用。
内容的提问来源于stack exchange,提问作者henveloper
相关产品推荐
相关产品推荐

