使用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