2011-12-23 9 views
22

में% समय और% समय के बीच असंगतता मुझे एक अजीब परिस्थिति का सामना करना पड़ रहा है जिसे मैं समझा नहीं सकता।आईपीथॉन

In [1]: def get_list_of_tuples(): 
    ...:  return [(i,) for i in range(10**6)] 
    ...: 

In [2]: %time res = get_list_of_tuples() 
CPU times: user 0.93 s, sys: 0.08 s, total: 1.01 s 
Wall time: 0.98 s 

In [3]: %timeit res = get_list_of_tuples() 
1 loops, best of 3: 92.1 ms per loop 

आप देख सकते हैं, tuples के इस बड़ी सूची की पीढ़ी सिर्फ एक दूसरे के नीचे ले जाता है: यहाँ अपने परीक्षण tuples की एक बड़ी सूची की पीढ़ी समय है। टाइमिट निष्पादन समय लगभग 0.1 सेकंड होने की रिपोर्ट करता है। दो रिपोर्टों में इतना बड़ा अंतर क्यों है?

+1

आप एक ही परिणाम मिलता है यदि आप चलाएँ:

टर्निंग कचरा संग्रहण रिटर्न, सवाल में दिखाया गया है एक के लिए इसी तरह के परिणाम कचरा संग्रहण के साथ निष्पादन के समय यानी बिना एक से परिमाण बड़ा है % timeit पहले और% समय दूसरा? – sth

+1

दिलचस्प टिप्पणी। हां, मुझे निष्पादन के उलट क्रम के साथ समान परिणाम मिलते हैं। – badzil

+0

मुझे आयरनपीथन नहीं पता है, इसलिए मैं '% time' या'% timeit' के बारे में ज्यादा कुछ नहीं कह सकता, लेकिन मेरा अनुमान होगा कि '% time' समय परीक्षण को 10 बार दोहराता है। –

उत्तर

29

मुख्य अंतर यह है क्योंकि "by default, timeit() temporarily turns off garbage collection during the timing" है के लिए Python timeit module documentation देखें।

In [1]: import timeit 

# Garbage collection on. 
In [2]: N = 10; timeit.timeit('[(i,) for i in range(10**6)]', 'gc.enable()', number=N)/N 
Out[2]: 0.74884700775146484 
# 749 ms per loop. 

# Garbage collection off. 
In [3]: N = 10; timeit.timeit('[(i,) for i in range(10**6)]', number=N)/N 
Out[3]: 0.15906109809875488 
# 159 ms per loop. 
3

बेनोइट (IPython 0.11, पायथन 2.6.5। पर परीक्षण किया गया),

अगर मैं अजगर 2.6.6 और IPython 0.10 का उपयोग तो मैं आपसे मिलते-जुलते जवाब देख। अजगर 2.7.1 और IPython 0.10.1 का उपयोग करना मैं और अधिक समझदार कुछ पाने:

% ipython 
Python 2.7.1 (r271:86832, Nov 3 2011, 16:23:57) 
Type "copyright", "credits" or "license" for more information. 

IPython 0.10.1 -- An enhanced Interactive Python. 

In [1]: def get_list_of_tuples(): 
    ...:  return [(i,) for i in range(10**6)] 
    ...: 

In [2]: %time res = get_list_of_tuples() 
CPU times: user 0.25 s, sys: 0.10 s, total: 0.35 s 
Wall time: 0.35 s 

In [3]: %timeit res = get_list_of_tuples() 
1 loops, best of 3: 215 ms per loop 
+0

आईपीथॉन 0.11 और पायथन 2.7.2 के साथ बहुत ही समान परिणाम प्राप्त हुए। – badzil

-6

% समय - केवल एक बार बयान चलाता है, और माप त्रुटि

% timeit है - बयान कई बार चलाता है, और सबसे choses सटीक समय

कुछ स्पष्टीकरण

+4

"आरटीएफएम" मेरे प्रश्न का उत्तर नहीं है। यदि मैं 1 मिलियन की बजाय 10 मिलियन टुपल्स की सूची उत्पन्न करता हूं, तो% समय की रिपोर्ट 56 एस और% टाइमिट 882 एमएस की रिपोर्ट करती है। यह सामान्य नहीं है और मैं जानना चाहता हूं क्यों। – badzil

+0

@badzil, क्या आपने हाथ से कुछ बार% समय निष्पादित करने की कोशिश की है? क्या परिणाम समान हैं? और यदि आपके पास 2.6 और 2.7 दोनों हैं, तो उत्पन्न कोडों के बीच मतभेदों को खोजने और खोजने के लिए प्रयास करें (मेरे पास केवल 2.7) – reclosedev

+0

परिणाम हैं यदि मैं कई बार% time और% timeit चलाता हूं तो परिणाम सुसंगत होते हैं। क्या आप जेनरेट कोड पर विस्तार कर सकते हैं? – badzil

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