Python スクリプトが重くてどこがボトルネックになっているか調べたいときに、いつもプロファイリングのやり方を忘れて調べ直してしまっていたのでメモ。
cProfile でプロファイリングする
Python 3 では標準でプロファイラが使える。
Python プロファイラ — Python 3 ドキュメント
もっと高性能なプロファイラもあるのかもしれないが、今回はシュッとプロファイリングすることが目的なのでこれを使う。
スクリプト全体をプロファイリングする場合
$ python -m cProfile -o profile.stats myscript.py
-o <filename>
を指定すると、結果を標準出力に出す代わりにファイルに出力する。
スクリプトの一部のみをプロファイリングする場合
import cProfile
import very_slow_function
cProfile.run('very_slow_function()', 'profile.stats')
cProfile.run
でプロファイリングしたい処理をラップする。
第二引数でファイル名を指定すると、結果を標準出力に出す代わりにファイルに出力する。
cProfileV でプロファイリング結果を閲覧する
cProfile で出力した結果ファイルはバイナリデータになっていてそのまま閲覧することはできない。
標準の pstats モジュールを使うと読み込めるのだが、使い方が覚えられないので今回は cProfileV というツールを使って閲覧する。
cProfileV のインストール
$ pip install cprofilev
インストールすると cprofilev
コマンドが使えるようになる。
cProfileV を利用する
$ cprofilev -f profile.stat
-f
オプションで結果ファイルを指定して cprofilev
コマンドを実行すると HTTP サーバが起動するので、ブラウザから http://localhost:4000/ にアクセスするとプロファイリング結果を閲覧できる。
各メソッドの実行回数や実行時間などで並び替えることができるので便利。