2017年6月21日水曜日

jupyter + lprun の設定メモ

line profilerを使って行ごとの処理時間を測ります。自分メモ。Python3, ubuntu16.04LTS

line profilerモジュールをインストール、設定

 condaでするなら。
conda install -c anaconda line_profiler   
でインストール。下記の設定をします。隠しフォルダ.ipythonの中のファイルに設定を書き込みます。ちなみに、ubuntu+jupyterではこれをしなくても動作しました。

 ~/.ipython/extensions/line_profiler_ext.py

を開きます。(なければ作成します)
import line_profiler
def load_ipython_extension(ip):
    ip.define_magic('lprun', line_profiler.magic_lprun)
と書いて保存し、マジックワードを設定。

~/.ipython/profile_default/ipython_config.py

を開いて、どこでも良いのでこれを追記します。
c.TerminalIPythonApp.extensions = [
  'line_profiler_ext',
]

lprunの使い方

1.

jupyterで使うときは、この一行を入れます。
%load_ext line_profiler
2.

測定したい部分を関数にします。
 def foo():
    list_test = []
    for i in range(1000):
        list_test.append(i)
3.

# %lprun  -f  関数名 関数(引数あれば)
を入力することで、関数の行ごとの時間を測ります。
%lprun -f foo foo()
結果はこのように出力されます。 これを見ると、どこに時間がかかっているかが分かります。

Hit: その行を通った回数
Time:その行にかかった時間(単位は上部のTimer unit: 1e-06 s→今はマイクロ秒)
Per Hit: その行を1回通るのにかかった時間
%Time: 全体の中でその行が占める時間割合




例えば今のforループをリスト内包表記に書き換えると。
def bar():
    lsit_test = [i for i in range(1000)]
速くなっているのが分かります。


Timer unit を設定するとき

デフォルトでは1e-06 s(マイクロ秒)ですが、環境によっては設定が変わって適当な値になることがあります。自分で明示的に設定するときは
# %lprun  -f  関数名 -u 0.000001 関数(引数あれば)
というように-u オプションを使います。

あるいは、このように設定します。
profiler = LineProfiler()
profiler.print_stats(output_unit=0.000001)

関数名を変数にしたいときは$を使う

func = 'some_function'
のとき、この変数funcをプロファイルするには$funcとしてlprunに渡します。
%lprun  -f  $func  関数(引数あれば)

lprunの結果をテキストに出力する

-T <filename>コマンドを使います。ファイル名はそのまま打てばよく、文字列にする必要はありません。
%lprun  -f  main -T test.txt main()
***Profile printout saved to text file 'test.txt'

と出力されます(これはソースをいじらないと消せない)。ディレクトリで指定したいときは
-T dir\test.txt
でOKです。

ファイル名を変数として渡すときは$filename のように$をつけます。

filename = 'test_var_name.txt'
%lprun  -f  main -T $filename main()

0 件のコメント:

コメントを投稿