2012-03-22 21 views
31

मैं अपने मशीन पर निम्न परिणाम प्राप्त:मैथ.फैक्टोरियल क्यों पाइथन 2.x से 3.x में धीमा है?

Python 3.2.2 (default, Sep 4 2011, 09:51:08) [MSC v.1500 32 bit (Intel)] on win 
32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import timeit 
>>> timeit.timeit('factorial(10000)', 'from math import factorial', number=100) 
1.9785256226699202 
>>> 

Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win 
32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import timeit 
>>> timeit.timeit('factorial(10000)', 'from math import factorial', number=100) 
9.403801111593792 
>>> 

मुझे लगा कि यह पूर्णांक/लंबे रूपांतरण के साथ कुछ हो सकता है, लेकिन factorial(10000L) 2.7 में किसी भी तेजी से नहीं है।

+0

10,000! - क्या आपको पता है कि वह संख्या कितनी बड़ी है? http://gimbo.org.uk/texts/ten_thousand_factorial.txt – duffymo

+7

@ डफिमो जो गति अंतर –

+0

की व्याख्या नहीं करता है, मैं इसे समझाने की कोशिश नहीं कर रहा हूं। मैं बस सोच रहा हूं कि क्या ओपी को पता है, यह सब कुछ है। int/long रूपांतरण शायद ही प्रासंगिक लगता है। आपका जवाब कहां है, इसाबावी? – duffymo

उत्तर

43

अजगर 2 naive factorial algorithm उपयोग करता है:

1121 for (i=1 ; i<=x ; i++) { 
1122  iobj = (PyObject *)PyInt_FromLong(i); 
1123  if (iobj == NULL) 
1124   goto error; 
1125  newresult = PyNumber_Multiply(result, iobj); 
1126  Py_DECREF(iobj); 
1127  if (newresult == NULL) 
1128   goto error; 
1129  Py_DECREF(result); 
1130  result = newresult; 
1131 } 

अजगर 3 divide-and-conquer factorial algorithm उपयोग करता है:

 
1229 * factorial(n) is written in the form 2**k * m, with m odd. k and m are 
1230 * computed separately, and then combined using a left shift. 

चर्चा के लिए Python Bugtracker issue देखें। उस बिंदु को इंगित करने के लिए धन्यवाद डीएसएम।

+11

चर्चा के लिए http://bugs.python.org/issue8692 देखें। – DSM

+0

दिलचस्प रूप से, और दुख की बात है, सी में स्पष्ट रूप से लागू होने के बावजूद, पाइथन 2.x में 'गणित। फैक्टोरियल' शुद्ध पायथन में एक मूर्ख 'फॉर' लूप का उपयोग करने से बहुत तेज प्रतीत नहीं होता है। पाइथन लंबे पूर्णांक का उपयोग करने के ऊपरी हिस्से में सी में लूपिंग से जो भी लाभ हो सकता है, वह खाया जाता है जैसा कि लिंक किए गए पायथन बगट्रैक थ्रेड में टिप्पणी की गई थी, अगर आप वास्तव में इस तरह की चीज़ के लिए प्रदर्शन चाहते हैं, तो 'gmpy' का उपयोग करें। –

+0

@ जॉनी मुझे यकीन नहीं है कि आपके द्वारा चुने गए कार्यान्वयन को महत्वपूर्ण एल्गोरिदम से परे महत्वपूर्ण है। बेवकूफ एल्गोरिदम के साथ अच्छा प्रदर्शन करना असंभव है, चाहे आप इसे असेंबली में कोड दें या इसे उच्च स्तर की भाषा में लिखें। – agf

संबंधित मुद्दे