- 作者: 池内孝啓,片柳薫子,岩尾エマはるか,@driller
- 出版社/メーカー: 技術評論社
- 発売日: 2017/09/09
- メディア: 大型本
- この商品を含むブログを見る
目次
- 目次
- はじめに
- 1. 環境の独立性を保つために各プロジェクト毎にvirtualenvを使う
- 2. Python3を使う
- 3. requirements.txtを保存しておく
- 4. すべてのimport文とパスの設定は初めのセルに入れる
- 5. はじめはコードは汚くても良い
- 6. グローバル名前空間を汚さないために、セルの中の処理は関数とする
- 7. 長い計算時間の結果をキャッシュするためにJoblibを使う
- 8. セルの独立性をできるだけ保つ
- 9. 変数名は短くても良い
- 10. ユーティリティ関数にはアサーションを使ってテストを書く
- 参考資料
- MyEnigma Supporters
はじめに
自分もJupyter notebookは
簡単な試行錯誤をメモとして残すために便利に使っていますが、
規模が大きくなったり、
他の人とノートブックを共有したりする時に、
どのように構造化すべきかと悩むことが多いです。
そんな時、下記にような記事を見つけたので、
作者に翻訳の許可をもらったので、
要約をメモしておきたいと思います。
1. 環境の独立性を保つために各プロジェクト毎にvirtualenvを使う
Pythonでは色々なライブラリを使うことが多いですが、
多くのライブラリでは、共通のライブラリに依存しており、
そのバージョンもバラバラなことが多いです。
あるプロジェクトで、ライブラリを更新すると、
それに引きずられて、他のライブラリが更新されてしまい、
別のプロジェクトのノートブックを実行しようとした時に、
動かなくなるということが頻発します。
そんな時は、各プロジェクト毎に
virtualenvなどを使って、独立の環境にしておいたほうが
他のプロジェクトに影響を与えずに済みます。
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
参考資料
- 作者: 池内孝啓,片柳薫子,岩尾エマはるか,@driller
- 出版社/メーカー: 技術評論社
- 発売日: 2017/09/09
- メディア: 大型本
- この商品を含むブログを見る
MyEnigma Supporters
もしこの記事が参考になり、
ブログをサポートしたいと思われた方は、
こちらからよろしくお願いします。