You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 00:12:08