Python3.11中赋值Lambda调用为何快于函数与未赋值Lambda?
Python 3.11中已赋值Lambda调用更快的原因分析
测试现象回顾
Python 3.11.2测试结果
Python 3.11.2 (tags/v3.11.2:878ead1, Feb 7 2023, 16:38:35) [MSC v.1934 64 bit (AMD64)] on win32 >>> from timeit import timeit >>> def test(): ... return 100 * 1000 ... >>> test2 = lambda: 100 * 1000 >>> print(timeit("test()", globals=globals()), timeit("test2()", globals=globals()), timeit("lambda: 100 * 1000")) 0.04339419997995719 0.039589399995747954 0.04896240000380203
- 调用已赋值lambda (
test2()):~0.0396秒 - 调用普通函数 (
test()):~0.0434秒 - 创建lambda对象:~0.0490秒
Python 3.7.9测试结果
Python 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 16:30:00) [MSC v.1900 64 bit (AMD64)] on win32 >>> from timeit import timeit >>> def test(): ... return 100 * 1000 ... >>> test2 = lambda: 100 * 1000 >>> print(timeit('test()', globals=globals()), timeit('test2()', globals=globals()), timeit('lambda: 100 * 1000')) 0.05223070000000973 0.05272850000000062 0.03326450000000136
- 调用普通函数和已赋值lambda耗时接近:~0.052秒
- 创建lambda对象:~0.033秒
核心疑问解答
1. 为何Python 3.11中已赋值lambda调用更快?
主要来自两个关键原因:
- 底层函数调用优化:Python 3.11通过PEP 659实现了更高效的函数调用路径,削减了调用时的栈操作、参数校验等冗余开销。这种优化对轻量函数(比如仅一行返回逻辑的lambda)的提升效果比复杂
def函数更明显——普通函数因携带更多元信息(如文档字符串、函数名绑定逻辑),调用时的额外操作略多于lambda。 - 避免重复创建对象的开销:已赋值的lambda是一个可复用的函数对象,调用时直接从全局/局部变量中查找执行;而
timeit("lambda: 100 * 1000")测试的是创建lambda对象的时间,每次执行都要生成新的function实例,包含字节码编译、属性初始化等步骤,自然比调用已存在的函数慢。
Python 3.7没有这些调用路径优化,函数调用的整体开销更高,同时创建lambda的相对开销更小,因此出现了和3.11相反的结果。
2. 是否应该为了性能将lambda赋值后使用?
- 性能收益可忽略:这种耗时差异仅在极端高频调用场景下才可能产生可感知的影响,绝大多数业务代码中无需为此调整写法。
- 可读性优先:将lambda赋值给变量并赋予有意义的名称,本身就比匿名lambda更易维护;甚至直接用
def定义普通函数的可读性更好,且和赋值后的lambda性能差异微乎其微。 - 本质是复用对象:这不是lambda独有的特性,任何函数对象复用(比如把普通函数赋值给变量后调用)都能避免重复创建的开销,和lambda本身无关。
内容的提问来源于stack exchange,提问作者NotMEE12
相关产品推荐
相关产品推荐

