MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

Jupyter notebook (iPython Notebook)を使う時に気をつけるべき10個のこと

 

目次

はじめに

自分もJupyter notebookは

簡単な試行錯誤をメモとして残すために便利に使っていますが、

myenigma.hatenablog.com

規模が大きくなったり、

他の人とノートブックを共有したりする時に、

どのように構造化すべきかと悩むことが多いです。

 

そんな時、下記にような記事を見つけたので、

medium.com

作者に翻訳の許可をもらったので、

要約をメモしておきたいと思います。

 

1. 環境の独立性を保つために各プロジェクト毎にvirtualenvを使う

Pythonでは色々なライブラリを使うことが多いですが、

多くのライブラリでは、共通のライブラリに依存しており、

そのバージョンもバラバラなことが多いです。

あるプロジェクトで、ライブラリを更新すると、

それに引きずられて、他のライブラリが更新されてしまい、

別のプロジェクトのノートブックを実行しようとした時に、

動かなくなるということが頻発します。

 

そんな時は、各プロジェクト毎に

virtualenvなどを使って、独立の環境にしておいたほうが

他のプロジェクトに影響を与えずに済みます。

github.com

https://qiita.com/th1209/items/84f21a4499548b34ec91qiita.com

  

2. Python3を使う

もうPython2を使うのはやめましょう。。

 

3. requirements.txtを保存しておく

他の人にノートブックを共有したり、

新しく環境を作成する時用に、

notebookで使っているモジュールの

requirements.txtをノートブックと

同じディレクトリに保存(バージョン管理)しておくと便利です。

 

requirements.txtの保存方法は、

$ pip freeze > requirements.txt

requirements.txt をつかったインストール方法は、

$ pip install -r requirements.txt

です。

 

4. すべてのimport文とパスの設定は初めのセルに入れる

すべてのimport文とパスの設定は、

ノートブックの最初のセルで実施すべきです。

これにより、依存しているライブラリが一覧でわかりやすくなり、

はじめてノートブックを実行する時に、

最初のセルを実行するだけで、任意の他のセルを実行できるようになります。

 

5. はじめはコードは汚くても良い

新しいアイデアの賞味期限は短いので、

ノートブックの作り始めは、

コードが汚くても良いとしましょう。

新しいセルを追加するのが難しくなってきたり、

パフォーマンスが気になってきたら、最適化しましょう。

  

6. グローバル名前空間を汚さないために、セルの中の処理は関数とする

Jupyter notebookでよくやる方法として、

パラメータを色々変えた処理を、何度も実行することがありますが、

コードをセル内にべた書きしていると、

中間変数がグローバル名前空間を汚し、

意図しない結果が発生したり、

不要なメモリ消費が発生したりします。

なので、セルの中の処理はできるだけ関数の中にいれて、

それらを別のセルから呼ぶような設計にしましょう。

 

7. 長い計算時間の結果をキャッシュするためにJoblibを使う

どうしても長い計算時間がかかるセルが

ノートブックにある場合は、

Joblibというライブラリのメモリキャッシュ機能を使って、

長い計算結果をファイルにキャッシュするようにすれば、

毎回、長い時間待たなくてよくなります。

 

joblibを使った場合、下記のように関数の出力をキャッシュできます。

from sklearn.externals.joblib import Memory
memory = Memory(cachedir='/tmp', verbose=0)
@memory.cache

def computation(p1, p2):
    ...

 

8. セルの独立性をできるだけ保つ

Jupyter notebookをメンテナンスしやすくするには、

できるだけ、セルの独立性を保つことが重要です。

 

グローバル変数を使わず、

それぞれのセルは関数でまとめ、

どうしても、他のセルの計算結果を使う場合は、

先程のキャッシュを使いましょう。

 

9. 変数名は短くても良い

通常のプログラミングでは、

変数名は長くて、できるだけ情報を持つほうが良いとされていますが、

Jupyter notebookの場合は、セルの独立性を保つことができれば、

短い方が読みやすく、使いやすいと思います。

 

10. ユーティリティ関数にはアサーションを使ってテストを書く

よく使うユーティリティ関数がある場合は、

assertを使って、関数と同じセル内にテストを作っておくと便利です。

def norm_scale(X, axis=0):
    mx = np.max(X, axis=axis)
    mi = np.min(X, axis=axis)
    epsilon = 10**-32
    return (X — mi) / (np.abs(mi) + mx + epsilon)

norm = norm_scale(X)
assert np.min(norm) >= 0
assert np.max(norm) <= 1

 

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

 

 

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com