2009-08-10 15 views
14

जब मैं टाइमिट() के बाहर नीचे कोड चलाता हूं, तो यह तत्काल पूर्ण हो जाता है। हालांकि जब मैं इसे टाइमिट() फ़ंक्शन के भीतर चलाता हूं, तो इसमें अधिक समय लगता है। क्यूं कर?पायथन: धीमी टाइमिट() फ़ंक्शन

>>> import timeit 
>>> t = timeit.Timer("3**4**5") 
>>> t.timeit() 
16.55522028637718 

का उपयोग करना: अजगर 3.1 (86) - AMD Athlon 64 X2 - WinXP (32 बिट)

+0

पेजिंग एलेक्स मार्टेलि, एलेक्स मार्टेलि, कृपया पाइथन टाइमिट मॉड्यूल पर टिप्पणी करें ... – hughdbrown

+0

रिची हिंडल पहले से ही सही था जब मैं ऑफ़लाइन था। और, मैं हमेशा "पायथन-माइटिटिट" का उपयोग करता हूं, कभी भी इंटरैक्टिव दुभाषिया या प्रोग्राम के भीतर समय-समय पर नहीं ;-) –

उत्तर

26

timeit() समारोह कोड कई बार (डिफ़ॉल्ट एक लाख) चलाता है और औसत लेता है समय

केवल एक बार कोड को चलाने के लिए ऐसा करते हैं:

t.timeit(1) 

लेकिन है कि आप विषम परिणाम देगा - यह अच्छे कारण के लिए दोहराया जाता है।

प्रति-लूप समय को दोहराने के लिए, लूप की संख्या से परिणाम विभाजित करें। यह एक लाख बार चलाने के लिए

count = 1000 
print t.timeit(count)/count 
+6

हाँ! मैं मॉड्यूल के रूप में समय सारिणी के बजाय कमांड लाइन से 'पायथन-माइटिटिट' का उपयोग करने की भी सिफारिश करता हूं - कमांड लाइन संस्करण में मॉड्यूल से बहुत अधिक आसान चीजें नहीं होती हैं (इस पर निर्भर करते हुए कि अलग-अलग बार दोहराएं धीमा/तेज वह है जिसे आप माप रहे हैं, उदाहरण के लिए: एक महान माइक्रोबेंमार्किंग तकनीक, मॉड्यूल इसे पेश नहीं करता है - आदि, आदि ;-)। –

+0

@Alex यहां आपकी टिप्पणी मुझे स्पष्ट नहीं है। क्या आप स्पष्ट कर सकते हैं कि सीएलआई पर अतिरिक्त कार्यक्षमता क्या उपलब्ध है। – Tshepang

+1

@Tshepang: समय-समय पर सीएलआई उपयोग पुनरावृत्ति की संख्या को "जादुई रूप से" चुनता है - धीमे कोड के लिए कुछ मापा जा रहा है, तेज़ कोड के लिए बहुत कुछ, बहुत तेज़ कोड के लिए बहुत कुछ - सटीक संतुलन सटीकता और परिणाम प्राप्त करने में लगने वाला समय। –

6

क्योंकि timeit चूक: पुनरावृत्ति की संख्या के लिए एक छोटे मान का उपयोग करें, तो एक लाख बहुत अधिक है। मुद्दा माइक्रो-बेंचमार्क करना है, और छोटी घटनाओं के सटीक समय प्राप्त करने का एकमात्र तरीका उन्हें कई बार दोहराना है।

3

docs के अनुसार, Timer.timeit() डिफ़ॉल्ट रूप से आपके कोड को दस लाख बार चलाता है। इस डिफ़ॉल्ट को बदलने के लिए "संख्या" पैरामीटर का उपयोग करें:

t.timeit(number=100) 

उदाहरण के लिए।

2

Timeit डिफ़ॉल्ट रूप से एक लाख लूप के लिए चलता है।

आपके पास संचालन के मुद्दों का भी आदेश हो सकता है: (3**4)**5 != 3**4**5

+0

सभी को धन्यवाद। बहुत उपयोगी। और हाँ, वह संचालन का इच्छित आदेश था। –

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