Help us understand the problem. What is going on with this article?

iPython notebookで研究開発生活

More than 5 years have passed since last update.

PythonのWebインタフェースであるiPython notebookを使って,自宅やスターバックスにこもりつつ作業するためのメモです.気が向いたときに更新していきます.

リモートサーバ上のnotebookにアクセスできるようにする

職場のワークステーション上でnotebookを起動しておけば,いつでもスターバックスで研究開発ができるようになります.導入にあたっては,ここを参考にします.c.IPKernelApp.pylab = 'inline' がとりわけ重要で,これをしておくことで,matplotlibで描画したものがnotebook上で表示できるようになります.

  • スターバックスで無料Wi-fiを利用する場合はこちら
  • スターバックスの美味しいコーヒーが飲める店舗はこちら

プログラムを実行する

テストごとに新しいnotebookを作るようにすると混乱しなくなります.
デバッグの際には以下のCell magicが便利です.

%time 時間を測る

kobito.1408941894.251522.png

%prun プロファイリングする

kobito.1408941924.757006.png

%debug デバッガを起動する

プログラムがエラーでとまった後に,適当なCellで%debugを実行するとipdbが起動します

並列計算する

いくつか方法があります.この辺も参考になります.

1 multiprocessing.Pool

このあたりを参考に,

from multiprocessing import Pool

p = Pool(n_cores)
p.map(func, [arg list])
p.close()

こんな感じで並列計算できます.注意すべき点としては,並列計算を回している途中でkobito.1408940334.347506.png ここの中断ボタンやリスタートボタンを押してしまうと,大概ワーカがゾンビ化してしまいます.その場合は,pkill Pythonなどでいったん全部殺してからもう一度notebookを立ち上げるようにしています.

2 IPython.parallel

iPython自体に並列計算のためのフレームワークがありますので,それを使うのも一つの手です.まず,iPython notebookを起動して最初に現れるダッシュボードからClustersタブを選択し,
kobito.1408941346.713972.png
ここの# 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スクリプトを走らせることもできます.たとえば,
kobito.1408943333.067115.png

これをちょっと変更すると,
kobito.1408943371.767258.png

こんな感じで簡単に(?)並列化できますね.Pythonでコマンドライン引数を使いたい場合,if(__name__ == '__main__'):ブロックを作り,sys.argvから読み出します.

ChromeからSSHを叩けるようにする

小規模なプログラムならiPython notebook上でも書けなくはないですが,プログラムがごつくなってくるとやはりちゃんと.pyファイルにした方が良いので,必然的にSSHでワークステーションに潜る必要が出てきます.僕はSecure Shell (link) を使っています.

  • 作業を中断できるように,端末多重化(たとえばtmux)も使えるようにしておくと便利
  • gedi-vimpython-modeを入れておくと便利
    • いずれもvim / emacs両方のバージョンがあるはず
    • gediを推す人が多い気がしますが,天邪鬼なのでpython-modeを使っています.変数のリネームや補完,PEP8に沿わない部分を勝手に直してくれる機能あたりが便利.

pythonのパッケージを管理する

僕はCanopyを使ってます.OpenCVもワンクリックで入れられて便利.enpkgコマンドを使うと,ターミナルからパッケージ管理ができます(link).Mac使いはキーチェインの問題でハマることがあるので,こちらもチェック.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away