2011-09-23 11 views
60

मैं इस timeit का उपयोग कर के साथ संघर्ष कर रहा हूँ और अगर किसी को कोई सुझावकार्यों में चर गुजरते समय पाइथन टाइमिट का उपयोग कैसे करें?

मूल रूप से मैं एक समारोह है (है कि मैं करने के लिए एक मूल्य के पारित) मैं की गति परीक्षण करना चाहते हैं के लिए किया था सोच रहा था और इस बनाया:

if __name__=='__main__': 
    from timeit import Timer 
    t = Timer(superMegaIntenseFunction(10)) 
    print t.timeit(number=1) 

लेकिन जब मैं इसे चलाने, मैं अजीब त्रुटियों timeit मॉड्यूल से आने वाले की तरह मिलता है .:

ValueError: stmt is neither a string nor callable 

अगर मैं अपने आप ही समारोह चलाने के लिए, यह ठीक काम करता है। जब मैं इसे मॉड्यूल के समय में लपेटता हूं, तो मुझे त्रुटियां मिलती हैं (मैंने डबल कोट्स का उपयोग करने की कोशिश की है और बिना .. आउटपुट)।

कोई सुझाव शानदार होगा!

धन्यवाद!

उत्तर

95

यह एक प्रतिदेय करें:

if __name__=='__main__': 
    from timeit import Timer 
    t = Timer(lambda: superMegaIntenseFunction(10)) 
    print t.timeit(number=1) 

काम करना चाहिए

+0

यह काम किया! बहुत बहुत धन्यवाद। मुझे यह पता लगाने की ज़रूरत है कि लैम्ब्डा क्या करता है .. ऐसा लगता है कि इससे फर्क पड़ता है। धन्यवाद पाब्लो – Lostsoul

+5

अगर यह केवल – endolith

+13

ओहियो दस्तावेज में था, लेकिन लैम्ब्डा कुछ ओवरहेड जोड़ता है, इसलिए छोटे चीजों का परीक्षण करने के लिए आदर्श नहीं है। 'टाइमिट 5 * 5' 33 एनएस है जबकि 'टाइमिट (लैम्ब्डा: 5 * 5)()' 233 एनएस है। – endolith

16

आपको एक स्ट्रिंग पास करनी चाहिए। अर्थात

t = Timer('superMegaIntenseFunction(10)','from __main__ import superMegaIntenseFunction') 
+0

जवाब oxtopus के लिए धन्यवाद! जब मैं इसे कोट्स में लपेटता हूं तो यह काम नहीं करता है, इसलिए इसकी एक स्ट्रिंग मुझे यह त्रुटि मिलती है: नाम त्रुटि: वैश्विक नाम 'superMegaIntenseFunction' परिभाषित नहीं किया गया है। आपको और क्या लगता है कि मैं कोशिश कर सकता हूं? – Lostsoul

+0

सेटअप तर्क शामिल करने के लिए उत्तर को सही किया गया। (http: //docs.python।संगठन/पुस्तकालय/timeit.html # timeit.Timer) –

21

Timer(superMegaIntenseFunction(10)) का अर्थ है "superMegaIntenseFunction(10) कहते हैं, तो Timer लिए परिणाम पारित"। यह स्पष्ट रूप से नहीं है कि आप क्या चाहते हैं। Timer या तो एक कॉल करने योग्य (जैसा कि यह लगता है: कुछ जिसे कहा जा सकता है, जैसे फ़ंक्शन), या एक स्ट्रिंग (ताकि वह स्ट्रिंग की सामग्री को पायथन कोड के रूप में समझ सके)। Timer कॉल करने योग्य चीज़ को बार-बार कॉल करके और यह देखने में कितना समय लगता है।

Timer(superMegaIntenseFunction) टाइप चेक पास करेगा, क्योंकि superMegaIntenseFunction कॉल करने योग्य है। हालांकि, Timer नहीं पता होगा कि superMegaIntenseFunction पर कौन से मान पास होंगे।

इसके आसपास का सरल तरीका, कोड के साथ एक स्ट्रिंग का उपयोग करना है। हमें कोड में 'सेटअप' तर्क पारित करने की आवश्यकता है, क्योंकि स्ट्रिंग को एक नए संदर्भ में "कोड के रूप में व्याख्या किया गया है" - इसके पास globals तक पहुंच नहीं है, इसलिए आपको कोड का एक और बिट चलाने की आवश्यकता है परिभाषा उपलब्ध है - @ oxtopus का जवाब देखें।

lambda (जैसा कि @ पाब्लो के उत्तर में है) के साथ, हम पैरामीटर 10 को superMegaIntenseFunction पर कॉल करने के लिए बाध्य कर सकते हैं। हम जो भी कर रहे हैं वह एक और कार्य बना रहा है, जिसमें कोई तर्क नहीं होता है, और superMegaIntenseFunction10 पर कॉल करता है। ऐसा लगता है कि आप def का उपयोग ऐसे किसी अन्य फ़ंक्शन को बनाने के लिए करते थे, सिवाय इसके कि नए फ़ंक्शन को कोई नाम नहीं मिलता है (क्योंकि इसकी आवश्यकता नहीं है)।

1

भविष्य के आगंतुकों के लिए एक नोट। यह pdb डिबगर में काम आप करने की जरूरत है, और superMegaIntenseFunction वैश्विक दायरे में नहीं है, तो आप globals को जोड़कर यह काम कर सकते हैं:

globals()['superMegaIntenseFunction'] = superMegaIntenseFunction 
timeit.timeit(lambda: superMegaIntenseFunction(x)) 

Note that the timing overhead is a little larger in this case because of the extra function calls. [source]