# 10 `timeit` -- 小さなコード断片の実行時間計測

バージョン 2.3 で 新たに追加 された仕様です。

このモジュールは Python の小さなコード断片の時間を簡単に計測する手段を 提供します。インターフェースはコマンドラインとメソッドとして呼び出し可 能なものの両方を備えています。また、このモジュールは実行時間の計測にあ たり陥りがちな落し穴に対する様々な対策が取られています。詳しくは、 O'Reilly の Python Cookbook、``Algorithms'' の章にある Tim Peters が書いた解説を参照してください。

このモジュールには次のパブリック・クラスが定義されています。

クラス `Timer`( | [stmt=`'pass'` [, setup=`'pass'` [, timer=<timer function>]]])

  小さなコード断片の実行時間計測をおこなうためのクラスです。

  コンストラクタは引数として、時間計測の対象となる文、セットアップに使用 する追加の文、タイマ関数を受け取ります。文のデフォルト値は両方とも `'pass'` で、タイマ関数はプラットフォーム依存(モジュールの doc string を参照)です。文には複数行の文字列リテラルを含まない限り、改行を 入れることも可能です。

  最初の文の実行時間を計測には `timeit()` メソッドを使用します。 また `timeit()` を複数回呼び出し、その結果のリストを返す `repeat()` メソッドも用意されています。

`print_exc`( | [file=`None`])

  計測対象コードのトレースバックを出力するためのヘルパー。

  利用例:

          t = Timer(...)       # try/except の外側で
          try:
              t.timeit(...)    # または t.repeat(...)
          except:
              t.print_exc()

  標準のトレースバックより優れた点は、コンパイルしたテンプレートのソース 行が表示されることです。オプションの引数 file にはトレースバック の出力先を指定します。デフォルトは `sys.stderr` になっています。

`repeat`( | [repeat`=3` [, number`=1000000`]])

  `timeit()` を複数回呼び出します。

  このメソッドは `timeit()` を複数回呼び出し、その結果をリストで 返すユーティリティ関数です。最初の引数には `timeit()` を呼び出 す回数を指定します。2番目の引数は `timeit()` へ引数として渡す 数値です。

  注意:

  結果のベクトルから平均値や標準偏差を計算して出力させたいと思うかもしれ ませんが、それはあまり意味がありません。多くの場合、最も低い値がそのマ シンが与えられたコード断片を実行する場合の下限値です。結果のうち高めの 値は、Python のスピードが一定しないために生じたものではなく、時刻取得 の際他のプロセスと衝突がおこったため、正確さが損なわれた結果生じたもの です。したがって、結果のうち `min()` だけが見るべき値となりま す。この点を押さえた上で、統計的な分析よりも常識的な判断で結果を見るよ うにしてください。

`timeit`( | [number`=1000000`])

  メイン文の実行時間を number 回取得します。このメソッドはセットアッ プ文を1回だけ実行し、メイン文を指定回数実行するのにかかった秒数を浮動 小数で返します。引数はループを何回実行するかの指定で、デフォルト値は 100万回です。メイン文、セットアップ文、タイマ関数はコンストラクタで指 定されたものを使用します。

  注意: デフォルトでは、 `timeit()` は時間計測中、一時的にガーベッジコレ クションを切ります。 このアプローチの利点は、個別の測定結果を比較しやすくなることです。 不利な点は、GC が測定している関数のパフォーマンスの重要な一部かもしれな いということです。 そうした場合、setup 文字列の最初の文で GC を再度有効にすることがで きます。 例えば :

          timeit.Timer('for i in xrange(10): oct(i)', 'gc.enable()').timeit()