1

我正在优化一个我遇到速度问题的 python 程序。我正在处理另一个文档,其中包含我的程序中出现的各种可能影响总执行速度的东西。

我找到:

a = 0
for x in range(10000000):
    a += x
return a 

略慢于:

a = 0
for x in range(10000000):
    a = a + x
return a 

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

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

4

2 回答 2

11

使用该timeit模块进行适当的计时。它避免了常见的陷阱,为您的平台使用最精确的计时器实现,并通过多次重复测试代码来尽量减少操作系统调度的影响。

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

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

>>> timeit.timeit('a += x', 'a = x = 1')
0.047940969467163086
>>> timeit.timeit('a = a + x', 'a = x = 1')
0.04770612716674805

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

>>> 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        
于 2013-07-20T13:11:04.347 回答
0

a += x基本上不是增量操作。您再次将变量分配a + xa。这与用 分配变量的值几乎相同a = a + x

因此,正如 Pieters 所提到的,没有理由在时间上有这样的差距。

+++++ 编辑到 DSM

Python中的整数是不可变的:如果你定义了a你就增加b

a = 5

b = 5

所以要'增加' b,你必须'重新分配'它b,这就是我的意思。

于 2013-07-20T14:19:12.820 回答