首页 > 解决方案 > 如何在 Python 中更高效地分配以及它在内部是如何工作的?

问题描述

在 Python 中是

a,b = b,a

比效率更高

temp = a
a = b
b = temp

? 它在内部是如何工作的?

标签: python

解决方案


作为实现细节,它的速度非常快,但不足以在大多数程序中产生有意义的差异。它更快,因为它避免了STORE/LOAD对有利于ROT_TWO指令的操作,该指令在将两个源变量加载到程序堆栈后使用,在STORE正常返回之前翻转堆栈的顶部两个元素的顺序。

如前所述,加速是微不足道的(在一些试验中,交换比显式临时更快,但只是个位数纳秒的问题,这几乎无关紧要),但阅读明显的交换更干净,所以人们在需要的时候倾向于喜欢它。

对于内部,该dis模块很有帮助:

>>> import dis

>>> dis.dis('a, b = b, a')
  1           0 LOAD_NAME                0 (b)
              2 LOAD_NAME                1 (a)
              4 ROT_TWO
              6 STORE_NAME               1 (a)
              8 STORE_NAME               0 (b)
             10 LOAD_CONST               0 (None)
             12 RETURN_VALUE

>>> dis.dis('temp = a; a = b; b = temp')
  1           0 LOAD_NAME                0 (a)
              2 STORE_NAME               1 (temp)
              4 LOAD_NAME                2 (b)
              6 STORE_NAME               0 (a)
              8 LOAD_NAME                1 (temp)
             10 STORE_NAME               2 (b)
             12 LOAD_CONST               0 (None)
             14 RETURN_VALUE

您可以看到交换需要更少的字节码指令,并且连续执行更多相同的指令(这可能有助于缓存利用率一点点)。确切的指令根据您执行它的位置(_NAME可能是_FAST_GLOBAL类似的)而有所不同,因此当指令更昂贵时可能会有更多的性能提升(我的微基准测试是针对使用_FAST开销最小的指令的函数本地人; 相对而言,在全局范围内运行可能会使切换音调更快)。但同样,面对更短、更简洁的代码与更长、更丑陋的代码之间的选择,这一切都是微不足道的。


推荐阅读