使用timeit
module做适当的时间。它避免了常见的缺陷,为您的平台使用最精确的计时器实现,并通过重复测试代码许多次,尽量减少操作系统调度的影响。
另一方面,使用探查器会增加大量开销以支持完整的调用堆栈; timeit
测量完整的执行时间,而不是堆栈中的单个调用。
使用timeit
显示了这两个版本都分不出(默认为1百万次迭代):
>>> 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
'dis.dis()'说什么?我觉得'a + = x'应该稍微快一点 –
就地版本稍微慢一点,因为'int'没有定义自己的原地添加,即'int'的槽'nb_inplace_add'为'0'。请参阅http://hg.python.org/releasing/3.3.1/file/8e5812b35480/Objects/longobject.c#l4918 – nymk