在 python 3.11 中,小规模列表推导式(如生成少于 100 个元素)可能比等效的 `for + append()` 循环慢 8–20%,这是由该版本中列表推导式初始化开销未优化所致;此问题已在 python 3.12 修复,且在 3.9/3.10 中并不存在。
列表推导式(List Comprehension)长期被推崇为 Pythonic 风格的核心实践——它简洁、可读性强,且通常具备性能优势。传统解释是:列表推导式通过底层 LIST_APPEND 字节码直接追加元素,规避了 .append() 方法查找(LOAD_METHOD)、调用(CALL)等开销,因此理应更快。然而,大量
实测(包括跨平台验证)揭示了一个反直觉现象:在 Python 3.11 中,对小列表(例如 10–100 项),列表推导式反而更慢。
这一现象的根本原因在于 Python 3.11 对列表推导式的实现引入了额外的初始化负担:
以下基准测试清晰印证了该版本特异性:
# Python 3.11.7 — 小列表(10 项):推导式更慢 $ python -m timeit -n 10_000_000 "x=[i for i in range(10)]" 10000000 loops, best of 5: 234 nsec per loop $ python -m timeit -n 10_000_000 "x=[]; [x.append(i) for i in range(10)]" # 或显式 for 循环 10000000 loops, best of 5: 191 nsec per loop # 快约 22% # Python 3.12.1 — 同样场景:推导式反超 $ python -m timeit -n 10_000_000 "x=[i for i in range(10)]" 10000000 loops, best of 5: 160 nsec per loop # 快约 20%
值得注意的是,这种“小列表劣势”仅存在于 Python 3.11。实测对比(3.9 / 3.10 / 3.11 / 3.12)表明:
立即学习“Python免费学习笔记(深入)”;
因此,开发者无需因 Python 3.11 的短暂异常而放弃列表推导式。实际工程中应坚持以下原则:
总之,列表推导式的“慢”并非设计缺陷,而是 Python 3.11 中一个已知、已修复的实现过渡态。坚守 Pythonic 实践,就是选择更健壮、更可持续、也终将最快的路径。