2011-12-23 14 views
22

Açıklayamadığım garip bir durumla karşılaşıyorum.IPython'da% time ile% timeit arasındaki tutarsızlık

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 

Gördüğünüz gibi, dizilerini bu büyük listesinin nesil sadece bir saniye altında sürer: Burada dizilerini büyük bir listenin oluşturulmasını zamanlama benim testtir. timeit, yürütme süresinin yaklaşık 0.1 saniye olduğunu bildirir. İki raporda neden bu kadar büyük bir fark var? Ben Python 2.6.6 ve IPython 0.10 kullanıyorsanız

+1

aynı sonucu alır mıyım:

çöp toplama ile yürütme zaman yani söz konusu gösterilene benzer çöp toplama döner sonuçlarına Torna olmadan birden büyüklüğü büyüktür % timeit ilk ve% saniye saniye? – sth

+1

İlginç bir yorum. Evet, tersine bir yürütme sırasına benzer sonuçlar elde ediyorum. – badzil

+0

IronPython'u bilmiyorum, bu yüzden '% time' veya 'time time' hakkında çok fazla şey söyleyemem, ama benim tahminim '% time' zamanlama testini 10 kez tekrarlar. –

cevap

29

için Python timeit module documentation bakınız. koşarsan

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

Benoit (ipython 0.11, Python 2.6.5. Üzerinde test)

,

sonra sizinkine benzer yanıtları görmek. Python 2.7.1 ve ipython 0.10.1 kullanarak daha mantıklı bir şey olsun: - sadece bir kez deyimi çalıştırır ve ölçüm hatayı

% sürümüyle gelen timeit var -

% 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

IPython 0.11 ve Python 2.7.2 ile çok benzer sonuçlar elde ettik. – badzil

-6

% süresini deyimi birkaç kez çalışır ve çoğu choses doğru zaman.

temel fark "by default, timeit() temporarily turns off garbage collection during the timing" Çünkü bazı açıklamalar

+4

"RTFM" soruma bir cevap değil. Eğer 1 milyon yerine 10 milyon tuple bir liste oluşturursam,% zaman raporları 56 s ve% timeit 882 ms. Bu normal değil ve nedenini bilmek istiyorum. – badzil

+0

@badzil, el ile% defa birkaç kez çalıştırmayı denediniz mi? Sonuçlar aynı mı? Eğer hem 2.6 hem de 2,7'niz varsa, üretilen kodlar arasında farklılıklar bulmaya çalışın (sadece 2.7 değerine sahibim) – reclosedev

+0

Eğer% zaman ve% timeit'i birkaç kez çalıştırırsam sonuçlar tutarlı olur. Oluşturulan kod hakkında ayrıntılı bilgi verebilir misiniz? – badzil