【问题标题】:How is assigning more efficient in Python and how does it work internally? [duplicate]如何在 Python 中更高效地分配以及它在内部是如何工作的? [复制]
【发布时间】:2020-11-17 09:55:21
【问题描述】:

在 Python 中是

a,b = b,a

效率更高

temp = a
a = b
b = temp

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

【问题讨论】:

  • 我猜这是一个效率不太可能成为最重要指标的地方。选择你的效率战。

标签: python


【解决方案1】:

作为实现细节,它的速度微乎其微,但不足以在大多数程序中产生有意义的差异。它更快,因为它避免了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 指令的本地人;相对而言,在全局范围内运行可能会使切换滴答声更快)。但同样,面对更短、更简洁的代码与更长、更丑陋的代码之间的选择,这一切都是微不足道的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多