आप निम्नलिखित समय को देखें, तो:पूर्णांक .__ 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
>>>
वे एक ही दिखाई देते हैं, तो क्यों है निष्पादन गति में एक अंतर है? मैं अजगर
python3 पर एक ही होता है की CPython कार्यान्वयन की चर्चा करते हुए हूँ:
$ 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
आप 'टेस्ट()' के बाइटकोड डिस्सेप्लर देख रहे हैं और यह सिर्फ 'mul' कहता है, इसलिए यह दोनों मामलों में समान है। यह 'मुल' के दो कार्यान्वयन है जो शायद अलग हैं। –
@HristoIliev धन्यवाद, मैंने नहीं किया कि यह केवल परीक्षण को अलग कर रहा था। मुझे लगता है कि बहुत अधिक समझ में आता है। मैं देख रहा हूं कि इन्हें कुछ और कैसे लागू किया गया था। – HennyH
क्या आप अजगर दो का उपयोग कर रहे हैं? समस्या यह हो सकती है कि इंटेल की मां बहती रहेगी और लंबे समय तक चलने वाली कॉल को कॉल करेगी जबकि ऑपरेटर इस अतिरिक्त कॉल से बच जाएगा। – Bakuriu