まんぼう日記

takataka's diary

IPython の %autoreload

たかたかの研究分野の国際会議が近々京都であります.1週間のうち2,3日なら顔出せるかな,とスケジュールを確認したら,授業やら重要な会議やらで半日しか都合がつかへんことが判明…参加はあきらめました (;_;)  休講にしたら補講が大変(3から5コマ分どこかで補講せなあかん)やし.自分が発表するんやったらがんばって補講の手配する気にもなるかもですが.

 

そんなこんなで,自分でがんばってちまちま研究するために,Python プログラミングの環境を整備しましょう,ということで,IPython の話.

 

 

以下のようなプログラム hoge.py

HOGE = 4649

def f(x):
    return x + 1314

と,それを import するプログラム fuga.py

import hoge

print hoge.HOGE
print hoge.f(hoge.HOGE)

があったとします.

 

たかたかの環境(Python 2.7.12 + IPython 4.1.2)で実行するとこうなります.

In [1]: %run fuga.py
4649
5963
(ここで hoge.py の 4649 を 4645 に変更)
In [2]: %run fuga.py
4649
5963

二度目の fuga.py 実行時に hoge.py を読み込み直したりはしてくれないので,出力は変わってないことが分かります.プログラムをちょこっと書き換え → 実行,ってのを繰り返すにはとっても不便.

 

で,とりあえずの解決策は次の通り.

In [1]: %load_ext autoreload

In [2]: %autoreload 2

In [3]: %run fuga.py
4649
5963
(ここで hoge.py の 4649 を 4645 に変更)
In [4]: %run fuga.py
4645
5959

autoreload の詳細は autoreload — IPython 5.1.0 documentation へどうぞ.上記で明らかなように,autoreload は ipython の機能なので,python のバージョンが 2.7 でも 3 でも使えます.

 

でも ipython 起動するたびにこの呪文を唱えるのは面倒くさいですよね.調べてみたら,ipython 起動時に自動で実行するように設定ファイルを書いとけばよいようです.以下を参考にしました.

 

ipython の設定ファイルは ~/.ipython 以下にあります.プロファイルを複数作って切りかえて使ったりとかできるようですが,デフォルトの設定を変更するなら,~/.ipython/profile_default/ipython_config.pyというファイルに書けばok.

c = get_config()

c.InteractiveShellApp.extensions = [
    'autoreload'
]

c.InteractiveShellApp.exec_lines = [
    '% autoreload 2',
    'import numpy as np',
    'import scipy as sp',
]

ここではついでに np, sp の import もしとくことにしてみました.便利便利.

 

ただし,上記 Keybits の記事中のサンプルにも記述がありますが,%autoreload 2 すると,%run するたびに関係するもの全て reload することになるので,パフォーマンスに影響するかもしれない,という点に注意が必要です.