コンテンツ

EasyBenchというPython簡易ベンチマークツールをつくりました

Pythonで関数の実行時間を簡単に計測できるベンチマークツール EasyBench を作成しました。

Pythonにはtimeitという標準ライブラリが既に存在します。
しかし、実際に使ってみると以下のような課題がありました:

  1. コードを文字列化して入力する必要がある
  2. セットアップ機能はあるものの、全体の処理開始前に1度だけ実行される仕様で、
    各試行の直前に計測時間に含めずにセットアップする機能がない

直近で執筆していたPythonの入門記事で計算量を説明する際、実際に実行時間を計測して体感してもらう流れにしようとしていました。
しかし、上記の制約から思い通りの計測ができず、より柔軟なツールを求めてEasyBenchを開発しました。

EasyBenchには、用途に応じた3つの計測方法を用意しています。状況に合わせて選べます。

最もシンプルな方法は@benchデコレータを使う方法です。計測したい関数の上にデコレータを追加するだけで実行時間を計測できます。

ただし上記の書き方では、big_listの生成(list(range(1_000_000)))が最初の1回だけ行われ、
その後の各試行では同じリストが再利用されます。

各試行で新しいリストを使いたい場合は、以下のようにパラメータを関数化することで解決できます:

関数をパラメータとして扱うような複雑なケースでは、@bench.fn_paramsデコレータも用意しています。

複数の処理を比較したい場合は、EasyBenchクラスを継承する方法が適しています。
クラス内に計測対象のメソッドを定義し、設定やセットアップも一元的に管理できます。

複数のベンチマークスクリプトを一度に実行したい場合は、easybenchコマンドラインツールが便利です。
以下の簡単な3ステップで、プロジェクト全体の計測が可能になります:

  1. プロジェクトルートにbenchmarksディレクトリを作成
  2. この中にbench_*.pyの命名規則でベンチマークスクリプトを配置
  3. プロジェクトルートでeasybenchコマンドを実行
# 例: 10回の試行、メモリ計測あり、平均時間でソートした結果を表示
easybench --trials 10 --memory --sort-by avg

実行すると、すべてのベンチマークスクリプトが順に実行され、結果が一覧表示されます。
CI/CDパイプラインに組み込むことで、パフォーマンスの継続的なモニタリングも可能です。

EasyBenchには他にも以下のような機能があります:

  • 出力形式の変更: テーブル形式、JSON、CSVなど複数のフォーマットに対応
  • 試行回数の調整: 精度と実行時間のバランスに応じて調整可能
  • メモリ使用量の計測: 時間だけでなくメモリ効率も評価可能

より詳細な内容や高度な使用例については、EasyBenchの公式ドキュメントをご参照ください。

関連記事