14
如果你看看下面的時序:INT .__ mul__,執行2X慢operator.mul
C:\Users\Henry>python -m timeit -s "mul = int.__mul__" "reduce(mul,range(10000))"
1000 loops, best of 3: 908 usec per loop
C:\Users\Henry>python -m timeit -s "from operator import mul" "reduce(mul,range(10000))"
1000 loops, best of 3: 410 usec per loop
有執行速度
reduce(int.__mul__,range(10000))
和reduce(mul,range(10000))
後者速度更快之間的差異顯著。
使用dis
模塊看看發生了什麼事:
使用int.__mul__
方法:
C:\Users\Henry>python
Python 2.7.4 (default, Apr 6 2013, 19:55:15) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> mul = int.__mul__
>>> def test():
... mul(1,2)
...
>>> import dis
>>> dis.dis(test)
2 0 LOAD_GLOBAL 0 (mul)
3 LOAD_CONST 1 (1)
6 LOAD_CONST 2 (2)
9 CALL_FUNCTION 2
12 POP_TOP
13 LOAD_CONST 0 (None)
16 RETURN_VALUE
>>>
與操作mul
方法
C:\Users\Henry>python
Python 2.7.4 (default, Apr 6 2013, 19:55:15) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from operator import mul
>>> def test():
... mul(1,2)
...
>>> import dis
>>> dis.dis(test)
2 0 LOAD_GLOBAL 0 (mul)
3 LOAD_CONST 1 (1)
6 LOAD_CONST 2 (2)
9 CALL_FUNCTION 2
12 POP_TOP
13 LOAD_CONST 0 (None)
16 RETURN_VALUE
>>>
他們似乎是相同的,那麼,爲什麼執行速度有差異嗎?我指的是CPython的Python實現
同樣發生在python3的:
$ python3 -m timeit -s 'mul=int.__mul__;from functools import reduce' 'reduce(mul, range(10000))'
1000 loops, best of 3: 1.18 msec per loop
$ python3 -m timeit -s 'from operator import mul;from functools import reduce' 'reduce(mul, range(10000))'
1000 loops, best of 3: 643 usec per loop
$ python3 -m timeit -s 'mul=lambda x,y:x*y;from functools import reduce' 'reduce(mul, range(10000))'
1000 loops, best of 3: 1.26 msec per loop
您正在查看'test()'的字節碼反彙編,它只是調用'mul',因此在兩種情況下都是相同的。這是'mul'的兩個實現可能有所不同。 –
@HristoIliev謝謝,我沒有說它只是拆卸測試。我想這樣做更有意義。我會去看看這些如何實施更多。 – HennyH
你使用python兩個嗎?問題可能是int的mul會溢出並呼叫long的mul,而運營商避免這些額外的呼叫。 – Bakuriu