27

説明できない奇妙な状況に直面しています。タプルの大規模なリストを生成するテストのタイミングは次のとおりです。

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

ご覧のとおり、このタプルの大規模なリストの生成には1秒もかかりません。timeitは、実行時間を約0.1秒と報告します。2つのレポートにこのような大きな違いがあるのはなぜですか?

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

4

3 に答える 3

41

主な違いは、「デフォルトでは、timeit()はタイミング中にガベージコレクションを一時的にオフにする」ためです。

ガベージコレクションを回すと、質問に示されているものと同様の結果が返されます。つまり、ガベージコレクションを使用した場合の実行時間は、ガベージコレクションを使用しない場合よりも大幅に長くなります。

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.
于 2012-01-04T17:59:27.570 に答える
3

ブノワ、

Python2.6.6とIPython0.10を使用している場合、あなたと同様の答えが表示されます。Python2.7.1とIPython0.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
于 2011-12-23T19:02:09.293 に答える
-5

%time-ステートメントを1回だけ実行し、測定エラーが発生する

%timeit-ステートメントを数回実行し、最も正確な時間を選択します。

説明については、Pythontimeitモジュールのドキュメントを参照してください

于 2011-12-23T19:17:14.210 に答える