こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。
今回はPythonプログラムのパフォーマンス解析に役立つ pyFBI を紹介します。
Contents
プロファイル(profile)とは
プログラムのパフォーマンス解析結果に関する統計情報をプロファイルと呼びます。今回はPythonプログラムの下記項目を解析し、プロファイルを作成します。
- 各関数が呼ばれた回数
- 各関数の実行時間
どの関数に時間がかかっているか? 頻繁に呼ばれる関数はどれか? などを把握し、ボトルネックになっている処理を改修するのは、とても重要な作業です。
Python プロファイラ と pyFBI
標準ライブラリのPythonプロファイラはありますが、少し使いにくいので、今回はパフォーマンス解析が簡単かつ、結果(プロファイル)の可視化まで行ってくれる pyFBI を採用します。
実践!Pythonプログラムのパフォーマンス解析
適当なPythonプログラムを作成して、パフォーマンス解析を実践してみます。まずは以下のコマンドで pyFBI インストールします。
pip install pyfbi
Pythonプログラミング
今回は下記のプログラムを解析対象とします。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import time def func1(): time.sleep(1) def func2(): time.sleep(2) def func3(): time.sleep(3) |
func*()は*秒スリープするだけのシンプルな関数です。
pyFBIで任意の関数を解析
pyFBIを活用すれば、数行のコードを組み込むだけで解析ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import time import pyfbi @pyfbi.target def func1(): time.sleep(1) def func2(): time.sleep(2) @pyfbi.target def func3(): time.sleep(3) with pyfbi.watch(): [f() for f in (func1, func2, func3, func1)] pyfbi.show() |
このコードを実行すると以下の解析結果が表示されます。
@pyfbi.target を付けた関数が解析対象なので、func2 の結果はありません。func1 の実行時間は percall=0.999(約1sec)、2回呼ばれたので ncalls=2 という結果でした。
cumtime(累計時間)は以下の式で算出されます。
cumtime = percall * ncalls
そのため func1 の場合、cumtime=1.997(約2sec)でした。その他の項目も同様の見方でパフォーマンスを確認できます。
pyFBIですべての関数を解析
すべての関数を解析対象とする場合は、以下のコードを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import time import pyfbi def func1(): time.sleep(1) def func2(): time.sleep(2) def func3(): time.sleep(3) with pyfbi.watch(global_watch=True): [f() for f in (func1, func2, func3, func1)] pyfbi.show() # pyfbi.dump("./profiles/main_profile") |
global_watch=Trueとすれば、@pyfbi.targetの有無に関係なく、すべての関数が解析対象となります。
プロファイルの可視化
末尾に以下のコードを組み込むことで、プロファイルを保存できます。
1 2 3 |
pyfbi.dump("output-filepath") |
例えば、以下のように設定すれば、profilesフォルダ に main_profiles という名前のファイルが保存されます。
1 2 3 |
pyfbi.dump("./profiles/main_profile") |
以下のコマンドでプロファイル可視化ツールを起動できます。
pyfbi_viz –stat_dir=”./profiles”
※パスやフォルダ名は任意に変更してください
port 3000と表示されたら、適当なブラウザ(Google chrome など)に http://127.0.0.1:3000 と打ち込めば、以下のようなプロファイルを可視化した画面が表示されます。
※本記事では割愛しますが、統計情報の表も画面に表示されます
ツールを終了するときは、ターミナルに Ctrl + c と打ち込みます。
まとめ -pyFBIでPythonプログラムのパフォーマンス解析-
Pythonプログラムのパフォーマンス解析を実践しました。 pyFBI を活用すれば、簡単にプロファイル作成から可視化まで行えます。
ボトルネックになっている処理を発見・改修を行い、プログラムのパフォーマンス向上を目指しましょう。
本記事が、より良いソースコードを書くときの参考になれば嬉しいです。
以下に良いコードを書くための参考書籍を紹介します。ご参考までに。