Pythonの処理速度を測る!timeitモジュールでコードを最適化
この記事では、Pythonの標準ライブラリ**timeitモジュール**を使って、特定のコードブロックや関数の実行時間を正確に計測する方法について解説します。コードのパフォーマンスを比較したり、ボトルネックを特定して最適化を進めたい場合に、timeitは非常に強力なツールとなります。
なぜ処理時間を計測するのか?
-
パフォーマンスの比較: 複数のアルゴリズムや実装方法の中から、最も効率的なものを選ぶために実行時間を比較します。
-
ボトルネックの特定: プログラムの中で最も時間を消費している部分(ボトルネック)を見つけ出し、そこを重点的に最適化することで全体の高速化を図ります。
-
コードの最適化: 改善が本当に効果があったのかを数値で確認し、より良いコードを書くためのフィードバックを得ます。
timeitモジュールとは?
**timeit**モジュールは、Pythonの小さなコードスニペットの実行にかかる時間を計測するために設計された標準ライブラリです。正確な時間を計測するために、ガベージコレクションを一時的に無効にするなど、様々な工夫が凝らされています。コマンドラインから利用することも、Pythonスクリプト内で利用することも可能です。
timeitの基本的な使い方
timeitモジュールを使ってコードの実行時間を計測する基本的な手順を説明します。
timeit.timeit()関数でコードスニペットを計測
timeit.timeit()関数は、引数に計測したいコードを文字列で渡し、そのコードを複数回実行して平均実行時間を計測します。
import timeit
# 計測したいコード
code_to_measure = """
sum_val = 0
for i in range(1000):
sum_val += i
"""
# 1000回繰り返して実行時間を計測
# number: コードを実行する回数 (デフォルトは1,000,000)
# setup: 計測前に一度だけ実行されるセットアップコード
execution_time = timeit.timeit(code_to_measure, number=1000)
print(f"1000回実行にかかった時間: {execution_time:.6f}秒")
この例では、range(1000)を使ったループの合計時間を1000回実行して計測しています。number引数を調整することで、計測の精度を変更できます。
timeit.Timerクラスを使う
より複雑なセットアップや、複数の計測を行いたい場合は、timeit.Timerクラスを使用すると便利です。
import timeit
setup_code = """
my_list = [i for i in range(1000)]
"""
code_to_measure = """
# リスト内包表記
new_list = [x * 2 for x in my_list]
"""
# Timerオブジェクトを作成
timer = timeit.Timer(stmt=code_to_measure, setup=setup_code)
# timeit()メソッドで実行回数を指定して計測
execution_time = timer.timeit(number=1000)
print(f"リスト内包表記 1000回実行にかかった時間: {execution_time:.6f}秒")
# 別のコードと比較
code_to_compare = """
# forループ
new_list = []
for x in my_list:
new_list.append(x * 2)
"""
timer_compare = timeit.Timer(stmt=code_to_compare, setup=setup_code)
execution_time_compare = timer_compare.timeit(number=1000)
print(f"forループ 1000回実行にかかった時間: {execution_time_compare:.6f}秒")
この例では、リスト内包表記と従来のforループでのリスト生成のパフォーマンスを比較しています。setup引数で初期化処理を記述することで、計測対象のコードがスムーズに実行されます。
コマンドラインからの利用
Pythonスクリプトを実行せずに、ターミナルから直接timeitを利用することもできます。これは、簡単なコードスニペットの実行時間を素早く知りたい場合に便利です。
python -m timeit "'-'.join(str(n) for n in range(100))"
上記コマンドは、range(100)の要素をハイフンで結合する処理の実行時間を計測します。
注意点とヒント
-
setup引数の活用: 計測したいコードが依存する変数の定義やモジュールのインポートは、setup引数で行いましょう。これにより、計測対象のコードの純粋な実行時間を測ることができます。 -
numberとrepeat:-
number: 各計測ラウンドでコードを実行する回数。小さなコードの場合、多くの回数実行することで精度が上がります。 -
repeat: 計測ラウンドの回数(デフォルトは5)。複数の計測ラウンドを行い、その中で最も良い結果を使用することで、一時的なシステムの負荷変動による影響を排除できます。
-
-
ガベージコレクション:
timeitはデフォルトでガベージコレクションを無効にしますが、必要に応じてgc.enable()で有効にすることもできます。 -
短すぎるコードの計測: 非常に短いコードを計測する場合、
numberを十分に大きくしないと、結果が不安定になることがあります。
まとめ
timeitモジュールは、Pythonコードのパフォーマンスを正確に計測し、最適化に役立つ強力なツールです。関数やコードブロックの実行時間を比較することで、より効率的で高速なプログラムを書くための重要な情報が得られます。ぜひtimeitを活用して、あなたのPythonコードを最大限に最適化してみてください!
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座

