2011-12-23 2 views
22

私は説明できない奇妙な状況に直面しています。ここではタプルの大規模なリストの生成タイミング私のテストです:あなたが見ることができるようにIPythonの%timeと%timeitの不一致

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 

、タプルのこの大規模なリストの生成はちょうど秒未満かかります。 timeitは、実行時間を約0.1秒に報告します。 2つのレポートに大きな違いがあるのはなぜですか?

(IPython 0.11、Pythonの2.6.5でテスト。)

+1

あなたが実行する場合は、同じ結果を得ますか最初に%timeit、%time secondに? – sth

+1

興味深いコメント。はい、同様の結果が逆順で実行されます。 – badzil

+0

私はIronPythonを知らないので、 '%time'や'%timeit'についてはあまり言えませんが、 '%time'はタイミングテストを10回繰り返すと思います。 –

答えて

29

主な違いは、 "by default, timeit() temporarily turns off garbage collection during the timing" ためです。ガベージコレクションのリターンを回す

が質問に示したものと同様の結果、ガベージコレクションを実行する時間、すなわち1よりも大きい大きさではない:

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

ブノワ、

私は、Python 2.6.6とIPython 0.10を使用している場合、私はあなたに似た答えを参照してください。 Pythonの2.7.1とIPython 0.10.1使用私はもっと賢明な何かを得る: - 一度だけ文を実行し、測定誤差に

%のはtimeitを持っている -

% 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とPython 2.7.2で非常によく似た結果になりました。 – badzil

-6

%時間は声明を数回実行し、最もchosesが正確な時間。いくつかの説明については

参照Python timeit module documentation

+4

"RTFM"は私の質問に対する答えではありません。 100万の代わりに1000万のタプルのリストを生成すると、%timeレポートは56秒、%timeitレポートは882 msです。これは正常ではないので、私は理由を知りたい。 – badzil

+0

@badzil、手で%時間を何回か実行しようとしましたか?結果は同じですか? 2.6と2.7の両方を使用して、逆アセンブルし、生成されたコードの違いを見つけようとすると(私は2.7しかない) – reclosedev

+0

%timeと%timeitを何回か実行すると結果は一致します。生成されたコードについて詳しく説明できますか? – badzil