line_profilerをつかう[python]
pythonのプロファイルツール、line_profilerを使った時の備忘録
line_profilerとは
pythonのどのメソッドにどれくらい時間がかかったのかを計測してくれる便利ツール。 他にもプロファイラは歩けど、自分の書いたスクリプトの遅いところを探すのに便利。
インストール方法
pip単品でもあるんだけど、python3.7だと、Ctyhonと同時にインストールしないとうまく行かないパターンがある見たい。
Build from pypi fails for Python3.7
手持ちの環境が3.7だったので、これに沿ってインストール
pip install Cython git+https://github.com/rkern/line_profiler.git
コード修正~計測
計測したいメソッド(dev)の1行手前に”@profile”と1行加える作業をする。 修正後、以下のコマンドを実行する。
kernprof -l your_python.py
python -m line_profiler your_python.py.lprof
1行目でyour_python.lprofというファイル名でファイルが吐き出されて、2行目でそれをline_profilerでpython実行をするとプロファイル結果がでてくる。
total time: 58.7863 s
File: your_python.py
Function: facet at line 31
Line # Hits Time Per Hit % Time Line Contents
==============================================================
31 @profile
32 def facet(self, row):
33 24280 15656.0 0.6 0.0 attachment=[]
34 582720 323728.0 0.6 0.6 for k,v in self.order.items():
35 558440 13186545.0 23.6 22.4 d = row.get(k,0)
36 558440 302533.0 0.5 0.5 if d == 1:
37 102847 70516.0 0.7 0.1 attachment.append(v)
38
39 24280 44859521.0 1847.6 76.3 row['test']=attachment
40 24280 27843.0 1.1 0.0 return row
トータルで58秒このメソッドでかかっていて、39行目でその76%を使っていると見て取れる。 この場合はデータをseriesに追加していて遅くなってて、あとで直した。
プロファイルが終わったら書いた@profileの部分をコメントアウトして終了。 たまにやるけどよくわすれる。。。。