プロファイラは今まで何度も投稿されたネタですが、cProfileの出力をKCacheGrindとpyprof2calltreeとで可視化する方法の紹介です。
KCacheGrindはプロファイリング結果を可視化するツールで、元々はC言語のValgrindプロファイラの可視化ツールとして開発されたようです。pyprof2calltreeはcProfileの結果をKCacheGrindで読み込めるようにする変換ツールです。
用意するもの
- KCacheGrind https://github.com/KDE/kcachegrind
- GraphViz http://www.graphviz.org/download/
- pyprof2calltree https://pypi.python.org/pypi/pyprof2calltree
実験環境
OS: macOS High Sierra 10.13.2
Python3.6: Homebrewでインストールしたもの
インストール
# MacではQtでコンパイルされたqcachegrindを使う。
brew install qcachegrind
brew install graphviz
mkvirtualenv prof -p $(which python3)
pip install pyprof2calltree
そのほかテスト用
pip install numpy
実行例
例題としてマンデルブロ集合計算の計算をm.pyというファイル名で保存します。
import numpy as np
def mandel(z):
maxiter = 80
c = z
for n in range(maxiter):
if abs(z) > 2:
return n
z = z*z + c
return maxiter
def mandelperf():
r1 = np.linspace(-2.0, 0.5, 26)
r2 = np.linspace(-1.0, 1.0, 21)
return [mandel(complex(r, i)) for r in r1 for i in r2]
assert sum(mandelperf()) == 14791
cProfileを使って実行し、プロファイルの結果をm.cprofファイルに保存します。
python -m cProfile -o m.cprof m.py
pyprof2calltreeを-kオプションで立ち上げるとkcachegrindが起動します。
pyprof2calltree -k -i m.cprof
実行画面
Call Graphを選択するとグラフィカルに呼び出し順、実行回数、実行時間、全実行時間に占める割合が表示されます。
Call Graphの他にも分析に便利な機能がいくつもありますので試してみてください。