のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Python プロファイラを取得しよう

Sponsored Links

皆さんこんにちは
お元気ですか?最近お金が吹っ飛びます。

さて、本日はプロファイラの取得について

Python では初期からcProfileと呼ばれるプロファイラが入っています。
これを使うと、プロファイルを取得でき、関数が何回呼ばれたとかがわかるようになります。

いつぞやのKmeansのプロファイルを取ってみましょう。
機械学習 クラスタリングアルゴリズム、K平均法(Kmeans) - のんびりしているエンジニアの日記

python -m cProfile Kmeans.py
0 10077.5230341
1 9646.98443325
2 9492.10656551
3 9466.08347652
end 9466.08347652
         571179 function calls (565172 primitive calls) in 4.147 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 <string>:1(ArgInfo)
        1    0.000    0.000    0.000    0.000 <string>:1(ArgSpec)
        1    0.000    0.000    0.000    0.000 <string>:1(Arguments)

まず、見方ですが

ncalls 呼ばれた回数
totime 合計時間
percall 一回ごとの時間
cumtime 関数内での処理時間(他の関数も含んでます)
percall 関数内での処理時間

となっています。

しかし、これでは非常に見難いということで、時間でソートしてみました。
以下のようなコマンドを実行すると時間ソートが可能になります。

python -m cProfile -s time Kmeans.py
0 10085.8874755
1 9672.4877135
2 9492.10656551
3 9466.08347652
end 9466.08347652
         571635 function calls (565628 primitive calls) in 3.815 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    2.078    2.078    2.126    2.126 {matplotlib.backends._macosx.show}
    12506    0.111    0.000    0.112    0.000 {numpy.core.multiarray.array}
        1    0.059    0.059    0.077    0.077 backend_macosx.py:355(__init__)
     1360    0.037    0.000    0.209    0.000 colors.py:355(to_rgba_array)
      544    0.029    0.000    0.049    0.000 arrayprint.py:397(fillFormat)
        1    0.027    0.027    0.155    0.155 {method 'show' of '_macosx.FigureManager' objects}
     1673    0.027    0.000    0.062    0.000 transforms.py:99(invalidate)

matplotlibがいかに時間を食っているかよくわかりますね。

これを利用して、時間がかかっている関数の高速化を行うと実際のプログラムも高速化ができます。