PythonのWebインタフェースであるiPython notebookを使って,自宅やスターバックスにこもりつつ作業するためのメモです.気が向いたときに更新していきます.
リモートサーバ上のnotebookにアクセスできるようにする
職場のワークステーション上でnotebookを起動しておけば,いつでもスターバックスで研究開発ができるようになります.導入にあたっては,ここを参考にします.c.IPKernelApp.pylab = 'inline'
がとりわけ重要で,これをしておくことで,matplotlibで描画したものがnotebook上で表示できるようになります.
プログラムを実行する
テストごとに新しいnotebookを作るようにすると混乱しなくなります.
デバッグの際には以下のCell magicが便利です.
%time
時間を測る
%prun
プロファイリングする
%debug
デバッガを起動する
プログラムがエラーでとまった後に,適当なCellで%debug
を実行するとipdbが起動します
並列計算する
いくつか方法があります.この辺も参考になります.
1 multiprocessing.Pool
このあたりを参考に,
from multiprocessing import Pool
p = Pool(n_cores)
p.map(func, [arg list])
p.close()
こんな感じで並列計算できます.注意すべき点としては,並列計算を回している途中で ここの中断ボタンやリスタートボタンを押してしまうと,大概ワーカがゾンビ化してしまいます.その場合は,
pkill Python
などでいったん全部殺してからもう一度notebookを立ち上げるようにしています.
2 IPython.parallel
iPython自体に並列計算のためのフレームワークがありますので,それを使うのも一つの手です.まず,iPython notebookを起動して最初に現れるダッシュボードからClustersタブを選択し,
ここの# of enginesに所望のワーカ数を入力し,startします.
プログラム上では,以下のように書きます.
from IPython.parallel import Client
def test(x):
u'''
並列計算される関数
'''
return x **2
cli = Client()
dv = cli[:]
x = dv.map(test, range(100))
result = x.get()
3 プログラム自体を並列で走らせる
引数を変えつつ同じ関数を並列で複数走らせたい場合は1や2の方法が有効ですが,大きめのプログラムを並列で走らせたい場合,シェルスクリプトでバックグラウンド処理にして並列化させる方が簡単です.つまり,python program.py arg1 arg2... &
を複数書いたシェルスクリプトを実行しましょう.
「ここまでiPython notebookの話をしていたのに結局はシェルか!」というあなた,%%bash
コマンドを使うことで,notebookのCell上でbashスクリプトを走らせることもできます.たとえば,
こんな感じで簡単に(?)並列化できますね.Pythonでコマンドライン引数を使いたい場合,if(__name__ == '__main__'):
ブロックを作り,sys.argv
から読み出します.
ChromeからSSHを叩けるようにする
小規模なプログラムならiPython notebook上でも書けなくはないですが,プログラムがごつくなってくるとやはりちゃんと.pyファイルにした方が良いので,必然的にSSHでワークステーションに潜る必要が出てきます.僕はSecure Shell (link) を使っています.
- 作業を中断できるように,端末多重化(たとえばtmux)も使えるようにしておくと便利
-
gedi-vimかpython-modeを入れておくと便利
- いずれもvim / emacs両方のバージョンがあるはず
- gediを推す人が多い気がしますが,天邪鬼なのでpython-modeを使っています.変数のリネームや補完,PEP8に沿わない部分を勝手に直してくれる機能あたりが便利.
pythonのパッケージを管理する
僕はCanopyを使ってます.OpenCVもワンクリックで入れられて便利.enpkg
コマンドを使うと,ターミナルからパッケージ管理ができます(link).Mac使いはキーチェインの問題でハマることがあるので,こちらもチェック.