logo logo

April 28, 2019 04:01

jupyter notebookの作業効率化Tips

デフォルトのブラウザを指定する

まずはconfigファイルを生成

$ jupyter notebook --generate-config

生成された設定ファイルを編集する。デフォルトで開きたいブラウザのパスを指定し、該当箇所(c.NotebookApp.browser)を探して、以下のように変更(Macでchromeで開きたい場合)

c.NotebookApp.browser = '/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome %s'

プロファイリング(パフォーマンス解析)を行う

jupyter notebook中で書いたコードの実行時間やボトルネックを調査したい場面が出てくることもある。IPythonのマジックコマンドを用いると簡単にプロファイリングを実行できる

実行時間を計測する

  • %time%timeitを使うと、コードの実行時間を表示してくれる。
  • %%time%%timeitなどとすると、セル単位での実行時間の計測も可能
  • %timeはシングルショットの解析。%timeitはよしなに複数回での最速や平均、分散も出してくれるので、より正確なベンチマークを行いたい場合などは%timeitを使うのが良さそう
%time x = map(lambda x: x * 2, range(10000))

CPU times: user 9 µs, sys: 1 µs, total: 10 µs

Wall time: 15.7 µs

%timeit x = map(lambda x: x * 2, range(10000))

760 ns ± 96.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

cProfileで詳細な解析

%time/timeitではコードの実行時間で、どの処理でどの程度時間がかかるかはわからない。

Pythonで提供されているcProfileというプロファイラを用いると、関数の呼び出し回数や関数毎の実行時間なども調査することができます。%%prunを行頭に差し込むだけ

%%prun
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)

for n in range(50):
    res = factorial(n+1)
    print(res)

profile result

行毎orメモリー使用量の解析

cProfileでは関数の再帰的な呼び出しまで考慮したプロファイルを行なってくれるが、幾分オーバーキルというか、実用上は呼び出し関数中のどの行で時間かかってるのかといった特定が手っ取り早くできれば良いということも多い。またCPUの計算時間よりもメモリリソースが気になる場合もある。 そんな時はlineprofilerやmemoryprofilerといったモジュールの恩恵を受けると良い。

セル内で必要なモジュールのインポートを行う。

!pip install line_profiler memory_profiler

マジックコマンドのインポート

%load_ext line_profiler
%load_ext memory_profiler

これで%lprun%mprun コマンドが使えるようになる。

使い方:

%lprun -f 関数名 関数(あれば引数)

%mprun -f 関数名 関数(あれば引数)