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がいかに時間を食っているかよくわかりますね。
これを利用して、時間がかかっている関数の高速化を行うと実際のプログラムも高速化ができます。