2013-03-08 8 views
7

मैंने एक टिप्पणी देखी जो मुझे Why does Python code run faster in a function? पर सवाल पहुंचाती है।क्या यह वास्तव में सच है कि एक समारोह में पायथन कोड तेजी से चलता है?

मैं सोच पर पहुंचे, और लगा मैं इसे अपने आप timeit लाइब्रेरी का उपयोग कर की कोशिश करेगा, फिर भी मैं बहुत अलग परिणाम मिल गया:

(टिप्पणी: 10**810**7 में बदल गया था बातें एक छोटा सा करने के लिए त्वरित बनाने के लिए समय)

>>> from timeit import repeat 
>>> setup = """ 
def main(): 
    for i in xrange(10**7): 
     pass 
""" 
>>> stmt = """ 
for i in xrange(10**7): 
    pass 
""" 
>>> min(repeat('main()', setup, repeat=7, number=10)) 
1.4399558753975725 
>>> min(repeat(stmt, repeat=7, number=10)) 
1.4410973942722194 
>>> 1.4410973942722194/1.4399558753975725 
1.9 
  • मैं timeit सही ढंग से उपयोग किया?
  • ये परिणाम एक दूसरे से 0.1% अलग क्यों हैं, जबकि अन्य प्रश्नों के परिणाम लगभग 250% अलग थे?
  • क्या का उपयोग करते समय यह केवल एक फर्क पड़ता है CPython पायथन (जैसे साइथन) के संकलित संस्करण?
  • आखिरकार: पाइथन कोड वास्तव में फ़ंक्शन में तेज़ी से है, या यह सिर्फ इस पर निर्भर करता है कि आप इसे कैसे समय देते हैं?
+1

मुझे लगता है कि यह काफी हद तक कार्यान्वयन पर निर्भर है (ताकि दोनों संस्करण और वितरण (यानी सामान्य पायथन बनाम सीपीथन आदि) महत्वपूर्ण हैं)। साथ ही, आपको एक ही तुलना में सटीक उसी कोड को चलाने का प्रयास करना चाहिए (और इसे उसी समय समझाएं), बस एक उचित तुलना के लिए। – Cornstalks

+1

[यह पोस्ट] (http://stackoverflow.com/a/11241708/1961486) अंतर्दृष्टिपूर्ण है। – Octipi

+0

तो, ऐसा लगता है कि यह पाइथन (सीपीथन, पायपी, इत्यादि) के संकलित संस्करणों में महत्वपूर्ण है, लेकिन सादे पुराने वेनिला पायथन में यह अंतर का चाटना नहीं बनाता है! –

उत्तर

10

अपने परीक्षण में दोष रास्ता timeit अपने stmt के कोड को संकलित करता है। यह वास्तव में निम्नलिखित खाके में संकलित है:

template = """ 
def inner(_it, _timer): 
    %(setup)s 
    _t0 = _timer() 
    for _i in _it: 
     %(stmt)s 
    _t1 = _timer() 
    return _t1 - _t0 
""" 

इस प्रकार stmt वास्तव में, एक समारोह में चल रहा है fastlocals सरणी (अर्थात STORE_FAST) का उपयोग कर।

यहाँ f_opt बनाम unoptimized संकलित stmt समारोह f_no_opt में मार डाला के रूप में प्रश्न में अपने कार्य के साथ एक परीक्षण है:

>>> code = compile(stmt, '<string>', 'exec') 
>>> f_no_opt = types.FunctionType(code, globals()) 

>>> t_no_opt = min(timeit.repeat(f_no_opt, repeat=10, number=10)) 
>>> t_opt = min(timeit.repeat(f_opt, repeat=10, number=10)) 
>>> t_opt/t_no_opt 
0.4931101445632647 
+0

यह बहुत अच्छा है, और पायथन के आंतरिक कार्यों की एक उन्नत समझ दिखाता है। आपके अनुभव में, क्या यह इस बात को प्रभावित करता है कि हमें कोड (अनुकूलन चरण के दौरान) कैसे करना चाहिए? –

+2

अच्छी डिजाइन पहले से ही कार्यों का उपयोग करने और वैश्विक चर के उपयोग को कम करने के लिए कॉल करती है, लेकिन निश्चित रूप से गति की आवश्यकता वाले तंग लूपों में वैश्विक चरों तक पहुंचने से बचें। आप विकी में अधिक सलाह पा सकते हैं: [पायथन स्पीड] (http://wiki.python.org/moin/PythonSpeed)। – eryksun

1

यह संकलक अनुकूलन एल्गोरिदम के लिए आता है। जस्ट-इन-टाइम संकलन करते समय, कोड के अक्सर इस्तेमाल किए गए हिस्सों की पहचान करना बहुत आसान होता है यदि वे फ़ंक्शंस में पाए जाते हैं।

दक्षता लाभ वास्तव में किए जा रहे कार्यों की प्रकृति पर निर्भर करेगा। आपके द्वारा दिए गए उदाहरण में, आप वास्तव में कुछ भी कम्प्यूटेशनल गहन नहीं कर रहे हैं, जिससे ऑप्टिमाइज़ेशन के माध्यम से दक्षता में लाभ प्राप्त करने के कम अवसर मिलते हैं।

जैसा कि अन्य ने इंगित किया है, हालांकि, सीपीथन समय-समय पर संकलन नहीं करता है। जब कोड संकलित किया जाता है, हालांकि, सी कंपाइलर्स अक्सर उन्हें तेज़ी से निष्पादित करेंगे। जीसीसी संकलक पर इस दस्तावेज़ बाहर

की जांच: http://gcc.gnu.org/onlinedocs/gcc/Inline.html

+0

ऐसा लगता है कि यह सीपीथॉन के लिए सच है (क्योंकि यह संकलित है), लेकिन वेनिला पायथन के लिए नहीं है क्योंकि यह नहीं है। –

+0

@WesleyBaugh: रुको ... CPython "वेनिला" पायथन के समान नहीं है? या "वेनिला" पायथन कुछ और है? –

+0

सीपीथन मुश्किल से कोई अनुकूलन करता है। अनुकूलन की सीमा कुछ बेकार भार और दुकानों को खत्म कर रही है। सीपीथन में कोई जेआईटी नहीं है, और यह क्रमशः एक दुभाषिया के रूप में बाइटकोड निष्पादित करता है। (यह कई अन्य कार्यान्वयनों के लिए भी सही नहीं है, उदाहरण के लिए पीपीपी, आयरनपीथन या ज्योथन, जिनमें सभी के पास जेआईटी का समर्थन है)। – nneonneo

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