为何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
相关产品推荐
相关产品推荐

