【发布时间】:2020-11-17 09:55:21
【问题描述】:
在 Python 中是
a,b = b,a
效率更高
temp = a
a = b
b = temp
? 它在内部是如何工作的?
【问题讨论】:
-
我猜这是一个效率不太可能成为最重要指标的地方。选择你的效率战。
标签: 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 指令的本地人;相对而言,在全局范围内运行可能会使切换滴答声更快)。但同样,面对更短、更简洁的代码与更长、更丑陋的代码之间的选择,这一切都是微不足道的。
【讨论】: