Python
profile

Pythonのプロファイリングと可視化

プロファイラは今まで何度も投稿されたネタですが、cProfileの出力をKCacheGrindとpyprof2calltreeとで可視化する方法の紹介です。

KCacheGrindはプロファイリング結果を可視化するツールで、元々はC言語のValgrindプロファイラの可視化ツールとして開発されたようです。pyprof2calltreeはcProfileの結果をKCacheGrindで読み込めるようにする変換ツールです。

用意するもの

実験環境

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を選択するとグラフィカルに呼び出し順、実行回数、実行時間、全実行時間に占める割合が表示されます。

Screen Shot 2017-12-29 at 2.36.32 PM.png

Call Graphの他にも分析に便利な機能がいくつもありますので試してみてください。