为什么+ = x比a = a + x慢?

Pab*_*bce 1 python python-3.3

我正在努力优化我遇到速度问题的python程序.我正在玩另一个文档,其中包含了我的程序中出现的各种可能影响总执行速度的事情.

我找到:

a = 0
for x in range(10000000):
    a += x
return a 
Run Code Online (Sandbox Code Playgroud)

略慢于:

a = 0
for x in range(10000000):
    a = a + x
return a 
Run Code Online (Sandbox Code Playgroud)

第一个脚本执行需要1.5到1.55秒,而第二个脚本需要大约1,36-1.37秒(使用cProfile).

知道为什么会这样吗?谢谢 :)

Mar*_*ers 11

使用该timeit模块进行正确的计时.它避免了常见的缺陷,采用了最精确的计时器实现您的平台,并试图通过重复测试的代码,以尽量减少操作系统调度的影响很多倍.

另一方面,使用分析器会增加大量开销来支持检测完整的调用堆栈; timeit测量完整的执行时间,而不是堆栈中的单个调用.

使用timeit显示两个版本太接近调用(默认为100万次迭代):

>>> timeit.timeit('a += x', 'a = x = 1')
0.047940969467163086
>>> timeit.timeit('a = a + x', 'a = x = 1')
0.04770612716674805
Run Code Online (Sandbox Code Playgroud)

两个操作都是一个字节码:

>>> def f(): a += x
... 
>>> def g(): a = a + x
... 
>>> import dis
>>> dis.dis(f)
  1           0 LOAD_FAST                0 (a)
              3 LOAD_GLOBAL              0 (x)
              6 INPLACE_ADD         
              7 STORE_FAST               0 (a)
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE        
>>> dis.dis(g)
  1           0 LOAD_FAST                0 (a)
              3 LOAD_GLOBAL              0 (x)
              6 BINARY_ADD          
              7 STORE_FAST               0 (a)
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE        
Run Code Online (Sandbox Code Playgroud)