为什么INPLACE_ADD比python中的INPLACE_SUBTRACT快?

时间:2019-05-23 08:15:24

标签: python bytecode

这一切都始于Raymond Hettinger的tweet,它涉及替代增量算子,又称​​ Space Invador算子

我想使用模块timeit来检查+=-=-运算符的性能

Python 3

python3 -m timeit "for i in range(1000000): i+=1"                   
python3 -m timeit "for i in range(1000000): i-=-1" 

输出:

10 loops, best of 5: 35.9 msec per loop
10 loops, best of 5: 36.6 msec per loop

Python 2

python -m timeit "for i in range(1000000): i+=1"
python -m timeit "for i in range(1000000): i-=-1"

输出:

10 loops, best of 5: 35.7 msec per loop               
10 loops, best of 5: 36.7 msec per loop

请注意,在Python 2和Python 3中,+=-=-1mseci,尽管两个操作的结果只是简单地增加了变量{{1} }按1。

请参见下面使用dis模块为这两个运算符生成的字节码指令。

>>> import dis
>>> def io(i): i+=1
>>> def aio(i): i-=-1
>>> dis.dis(io)
  1           0 LOAD_FAST                0 (i)
              2 LOAD_CONST               1 (1)
              4 INPLACE_ADD
              6 STORE_FAST               0 (i)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
>>> dis.dis(aio)
  1           0 LOAD_FAST                0 (i)
              2 LOAD_CONST               1 (-1)
              4 INPLACE_SUBTRACT
              6 STORE_FAST               0 (i)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
>>> 

唯一的区别是INPLACE_ADDINPLACE_SUBTRACT指令,其余指令几乎相同。

0 个答案:

没有答案