含range的列表字面量转迭代器时的内存情况及两段代码内存占用对比
内存占用对比:CODE 1 vs CODE 2
先直接给结论:
- CODE 2会在创建列表的瞬时占用和CODE 1中列表相近的内存(也就是你说的41880左右),但这个列表会很快被Python垃圾回收机制回收;而CODE 1的列表会被变量
my_list持续引用,一直占用内存。两者的长期内存占用差异很大。
详细拆解:
CODE 1的内存行为
创建列表[l for l in range(5000)]并赋值给my_list后,这个包含5000个元素的列表会一直驻留在内存中(只要my_list还在当前作用域内)。iter(my_list)只是创建了一个迭代器对象,迭代器本身只保存迭代状态,占用的内存可以忽略不计,主要内存消耗来自my_list指向的列表。CODE 2的内存行为
执行iter([i for i in range(5000)])时,Python会先创建完整的5000元素列表(此时内存占用和CODE 1创建列表后一致),再基于这个列表生成迭代器my_iter2。但因为这个列表没有被任何变量引用,Python的垃圾回收器会在这行代码执行完成后很快回收这个列表的内存,最终只有my_iter2这个轻量迭代器占用少量内存。
优化建议:避免创建大列表
如果想彻底避免大列表的内存占用,应该直接使用生成器表达式,而不是列表推导式:
my_iter3 = iter(i for i in range(5000)) # 不会生成完整列表,内存占用极低
生成器表达式是按需生成元素,每次迭代才生成一个值,不会一次性把所有元素加载到内存中,这才是真正节省内存的写法。
内容的提问来源于stack exchange,提问作者dungarian
相关产品推荐
相关产品推荐

