Nếu bạn nhìn vào các timings sau:int .__ mul__, thực hiện chậm hơn so với 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
Có sự khác biệt đáng kể về tốc độ thực thi giữa
reduce(int.__mul__,range(10000))
và reduce(mul,range(10000))
với sau này là nhanh hơn .
sử dụng các mô-đun dis
để nhìn vào những gì đã xảy ra:
Sử dụng int.__mul__
phương pháp:
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
>>>
Và các nhà điều hành mul
phương pháp
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
>>>
Họ xuất hiện như nhau, vậy tại sao có một sự khác biệt trong tốc độ thực hiện? Tôi đề cập đến việc thực hiện CPython của Python
Cùng xảy ra trên 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
Bạn đang xem xét việc tháo gỡ bytecode của 'test()' và nó chỉ gọi là 'mul', do đó nó giống nhau trong cả hai trường hợp. Đó là hai cách thực hiện của 'mul' có lẽ khác nhau. –
@HristoIliev Cảm ơn, tôi đã không chỉ là thử nghiệm tháo rời. Tôi cho rằng điều đó có ý nghĩa hơn rất nhiều. Tôi sẽ xem xét cách chúng được thực hiện một số chi tiết sau đó. – HennyH
Bạn đang sử dụng python hai? Vấn đề có thể là mul của int sẽ tràn và gọi dài của mul trong khi nhà điều hành tránh các cuộc gọi thêm này. – Bakuriu