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 件のコメント:
コメントを投稿