EasyBenchというPython簡易ベンチマークツールをつくりました
Pythonで関数の実行時間を簡単に計測できるベンチマークツール EasyBench を作成しました。
制作の動機
Pythonにはtimeitという標準ライブラリが既に存在します。
しかし、実際に使ってみると以下のような課題がありました:
- コードを文字列化して入力する必要がある
- セットアップ機能はあるものの、全体の処理開始前に1度だけ実行される仕様で、
各試行の直前に計測時間に含めずにセットアップする機能がない
直近で執筆していたPythonの入門記事で計算量を説明する際、実際に実行時間を計測して体感してもらう流れにしようとしていました。
しかし、上記の制約から思い通りの計測ができず、より柔軟なツールを求めてEasyBench
を開発しました。
EasyBench
の使い方
EasyBench
には、用途に応じた3つの計測方法を用意しています。状況に合わせて選べます。
1. @bench
デコレータ - 単一関数の計測に最適
最もシンプルな方法は@bench
デコレータを使う方法です。計測したい関数の上にデコレータを追加するだけで実行時間を計測できます。
ただし上記の書き方では、big_list
の生成(list(range(1_000_000))
)が最初の1回だけ行われ、
その後の各試行では同じリストが再利用されます。
各試行で新しいリストを使いたい場合は、以下のようにパラメータを関数化することで解決できます:
関数をパラメータとして扱うような複雑なケースでは、@bench.fn_params
デコレータも用意しています。
2. EasyBench
クラス - 複数の処理を比較したい場合に便利
複数の処理を比較したい場合は、EasyBench
クラスを継承する方法が適しています。
クラス内に計測対象のメソッドを定義し、設定やセットアップも一元的に管理できます。
3. easybench
コマンド - プロジェクト全体の一括計測に
複数のベンチマークスクリプトを一度に実行したい場合は、easybench
コマンドラインツールが便利です。
以下の簡単な3ステップで、プロジェクト全体の計測が可能になります:
- プロジェクトルートに
benchmarks
ディレクトリを作成 - この中に
bench_*.py
の命名規則でベンチマークスクリプトを配置 - プロジェクトルートで
easybench
コマンドを実行
# 例: 10回の試行、メモリ計測あり、平均時間でソートした結果を表示
easybench --trials 10 --memory --sort-by avg
実行すると、すべてのベンチマークスクリプトが順に実行され、結果が一覧表示されます。
CI/CDパイプラインに組み込むことで、パフォーマンスの継続的なモニタリングも可能です。
カスタマイズと高度な機能
EasyBenchには他にも以下のような機能があります:
- 出力形式の変更: テーブル形式、JSON、CSVなど複数のフォーマットに対応
- 試行回数の調整: 精度と実行時間のバランスに応じて調整可能
- メモリ使用量の計測: 時間だけでなくメモリ効率も評価可能
より詳細な内容や高度な使用例については、EasyBenchの公式ドキュメントをご参照ください。