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

为何Python 3.11元组交换的反汇编字节码中缺失SWAP指令?

Python元组交换的字节码版本差异

之前有说法称Python新版本会用SWAP指令替代旧的ROT_TWO指令,但实际测试Python 3.11时会发现,执行元组交换a, b = b, a的函数反汇编结果里,并没有出现SWAP指令,而是采用了另一种更直接的实现方式。

Python 3.9.0 反汇编结果

>>> import dis
>>> def foo(a, b):
...     a, b = b, a
...
>>> dis.dis(foo)
  2           0 LOAD_FAST                1 (b)
              2 LOAD_FAST                0 (a)
              4 ROT_TWO
              6 STORE_FAST               0 (a)
              8 STORE_FAST               1 (b)
             10 LOAD_CONST               0 (None)
             12 RETURN_VALUE
>>>

Python 3.11.0 反汇编结果

>>> import dis
>>> def foo(a, b):
...     a, b = b, a
...
>>> dis.dis(foo)
  1           0 RESUME                   0

  2           2 LOAD_FAST                1 (b)
              4 LOAD_FAST                0 (a)
              6 STORE_FAST               1 (b)
              8 STORE_FAST               0 (a)
             10 LOAD_CONST               0 (None)
             12 RETURN_VALUE
>>>

元组交换a, b = b, a的内部实现原理

在Python 3.9这类较早版本中,执行a, b = b, a时,解释器会先把b和a依次压入栈,接着用ROT_TWO指令交换栈顶的两个元素,最后再把交换后的元素分别弹出赋值给a和b。

到了Python 3.11,解释器对这个常见操作做了针对性优化:它直接跳过了栈交换的步骤,调整了存储的顺序——先把栈顶的a值存到b的位置,再把次栈顶的b值存到a的位置,同样完成了交换,还少了一条指令,效率更高。至于原本计划引入的SWAP指令,在这个场景里根本没派上用场,因为这种直接修改存储目标的优化方案更高效。

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:41:11