Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのtimeitモジュールとは?コード実行時間の計測方法を実例付きで徹底解説

Pythonには、コードの実行時間を計測するためのさまざまな方法が用意されています。そのひとつが、標準ライブラリのtimeモジュールを使い、プログラムの実行前後の時刻を記録して差分を求めるというアプローチです。

Pythonのtimeitモジュールとは

プログラムが動作している間、バックグラウンドでは多くのプロセスが同時に稼働しており、コードが実行可能な状態を維持しています。しかし、timeモジュールではこれらのバックグラウンド処理にかかる時間は考慮されません。より正確なパフォーマンス計測が必要な場合は、timeitモジュールを使用するのが最適です。

timeitモジュールは、対象のコードをデフォルトで約100万回実行し、その中で最も短かった実行時間を計測結果として返します。これにより、一時的なシステム負荷などのノイズを排除した、信頼性の高い計測が可能になります。

CLIからPythonの実行時間を計測する

timeitモジュールはさまざまな方法で利用できますが、最も手軽なのがPythonのコマンドラインインターフェース(CLI)から直接使う方法です。

例1:コマンドラインでの使用

まずはCLIでtimeitを使ってみましょう。CLIから実行した場合、モジュール側が自動的に同じコードの繰り返し回数を決定してくれる点に注目してください。

C:\Users\rajesh>python -m timeit "'-'.join(str(n) for n in range(200))"
1000 loops, best of 3: 290 usec per loop

C:\Users\rajesh>python -m timeit "'-'.join(str(n) for n in range(200))"
1000 loops, best of 3: 292 usec per loop

C:\Users\rajesh>python -m timeit "'-'.join(str(n) for n in range(200))"
1000 loops, best of 3: 294 usec per loop

同じコードを3回実行しましたが、それぞれ290〜294マイクロ秒と、非常に安定した結果が得られています。

スクリプト内でtimeitを使う

次に、スクリプト内でtimeitを使う簡単な例を見てみます。CLIのようにコマンドライン構文を使わない場合は、import timeit文でモジュールを読み込む必要があります。

例2:timeit.timeit()の基本

#Import timeit module
import timeit

# The instructions being timed.
print('x' * 5)
print('x' + 'x' + 'x' + 'x' + 'x')

# Call timeit on the statements and print the time returned.
# ... Specify optional number of iterations.
print(timeit.timeit("y = 'x' * 3", number=10000000))
print(timeit.timeit("xy = 'x' + 'x' + 'x' + 'x' + 'x'", number = 10000000))

上記の例では、計測したいステートメントを引用符で囲んだ文字列としてtimeit.timeit()メソッドに渡し、number引数を指定して反復回数を増やしています。

出力結果

1回目の実行結果:

xxxxx
xxxxx
0.9041136896626635
0.7712796073957123

2回目の実行結果:

xxxxx
xxxxx
0.7317015874427751
0.7312688195585995

3回目の実行結果:

xxxxx
xxxxx
0.7240862411172824
0.7255863890794246

プログラムを複数回(3回)実行すると、実行時間にばらつきがあることがわかります。手動で何度も実行する代わりに、繰り返し処理をプログラム自身に行わせてみましょう。

timeit.repeat()で繰り返し計測する

#Import timeit module
import timeit
# Call timeit on the statements and print the time returned.
# ... Specify optional number of iterations.
print(timeit.repeat("y = 'x' * 3", number=10000000, repeat = 5))
print()
print(timeit.repeat("xy= 'x' + 'x' + 'x' + 'x' + 'x'", number = 10000000, repeat = 5))

出力結果

[0.7303736343436382, 0.7213687552991258, 0.7362311105941466, 0.7293136666273243, 0.7278277732068212]

[0.7388334197158559, 0.7378481457977326, 0.9486733868277772, 0.735295442480929, 0.7398226849056382]

repeat引数を指定することで、計測全体を5回繰り返し、結果をリストとして取得できます。

セミコロンで複数のステートメントを計測する

timeitモジュールでは、複数のステートメントをセミコロン(;)で区切って渡すこともできます。これは必ずしも最良のコーディングスタイルではありませんが、長めのコード断片を簡潔に指定したい場合に便利です。

#Import timeit module
import timeit

# Use semicolon for multiple statements.
print(timeit.repeat("x = 2; x *= 2", number=100000000))
print(timeit.repeat("x = 1; x *= 4", number=100000000))

出力結果

[24.859605879029118, 23.58795536845994, 23.95826726353284]
[22.70639977603264, 21.380195994245724, 20.71523588130414]

setup引数でカスタム関数を計測する

setup引数を指定すれば、自作のメソッドもtimeitで計測できます。setup引数には、計測対象の関数をインポートするためのimport文などを記述します。

#Import timeit module
import timeit

def func1():
    return 1

def func2():
    return sum([-1, 0, 1, 1])

# Test methods.
print(func1())
print(func2())

# Pass setup argument to call methods.
print(timeit.repeat("func1()", setup="from __main__ import func1"))
print(timeit.repeat("func2()", setup="from __main__ import func2"))

このプログラムでは、func1()メソッドとfunc2()メソッドのパフォーマンスを比較しています。

出力結果

1
1
[0.44798489246658874, 0.4411512652046069, 0.44570416580426686]
[1.583622557983199, 1.5712399227517881, 1.5469479030713984]

func1()は処理内容が単純な分、func2()よりも大幅に高速に実行されていることが確認できます。

まとめ

この記事では、timeitモジュールを使って小さなPythonコードのパフォーマンスを計測する方法を紹介しました。CLIからの利用方法だけでなく、スクリプト内でのtimeit()repeat()setup引数によるカスタム関数の計測まで幅広くカバーしています。正確なベンチマークを行いたい場面では、ぜひtimeitモジュールを活用してみてください。

  1. Pythonで3DプロットをPDFとして保存する方法

    Pythonで3DプロットをPDF形式で保存したい場合、Matplotlibのsavefig()メソッドを使えば簡単に実現できます。以下の手順に従ってください。 手順 図のサイズを設定し、サブプロット間および周囲のパディング(余白)を調整します。 新しい図(figure)を作成するか、既存の図をアクティブにします。 サブプロット配置の一部として、図に「ax」(3D軸)を追加します。 NumPyを使って u, v, x, y, z のデータポイントを生成します。 3Dワイヤーフレームをプロットします。 プロットにタイトルを設定します。 savefig() メソッドで現在の図をPDFとして保存

  2. PythonのPygameで画像を表示する方法

    Pygameは、Pythonでゲームやマルチメディアアプリケーションを開発するための定番マルチメディアライブラリです。本記事では、pygameモジュールを使用して、画像のサイズ(高さ・幅)やウィンドウ内での表示位置を考慮しながら、画面に画像を描画する方法を解説します。 画像表示の基本的な流れ 以下のサンプルプログラムでは、まずpygameモジュールを初期化し、ウィンドウのサイズとキャプション(タイトルバーの文字列)を設定します。その後、画像ファイルを読み込み、表示する座標を指定します。screen.blit()関数が実際に画面へ画像を描画し、whileループがウィンドウを閉じる操作(QUITイ