《惰性之美:生成器表达式 vs 列表推导式的性能与内存深度解析》
一、引言:一行代码背后的性能差异
在 Python 中,很多人写过这样的代码:
sum([i*i for i in range(1000000)])
也有人写过这样一行:
sum(i*i for i in range(1000000))
它们看起来几乎一样,甚至输出结果也完全一致。但你知道吗?这两者在内存使用和执行效率上却有着本质的区别。
作为一名长期从事 Python 性能优化与教学的开发者,我在一次数据处理任务中,因使用列表推导式导致内存暴涨,最终不得不重构为生成器表达式。那次经历让我深刻体会到:写得优雅不等于写得高效。
本文将带你深入理解生成器表达式的“惰性求值”机制,并通过实战对比,揭示它与列表推导式在性能与内存上的差异。
二、基础语法回顾:列表推导式与生成器表达式
列表推导式(List Comprehension)
语法形式:
[expression for item in iterable if condition]
特点:
- 返回一个完整的列表对象
- 所有元素一次性生成并存储在内存中
生成器表达式(Generator Expression)
语法形式:
(expression for item in iterable if condition)
特点:
- 返回一个生成器对象
- 元素按需生成,惰性求值
三、惰性求值:生成器的核心优势
生成器表达式的最大特点是惰性求值,即只有在需要时才生成下一个元素。
示例:逐步生成 vs 一次性生成
gen = (i*i for i in range(

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



