回心誌

世の中わがんね

【cython、IPython】IPythonでpyx更新時に一々抜けなくても済む方法

IPython上でpyximportを使うと、pyxファイルをimportすることができる。嬉しいことに、その場でコンパイルまでしてくれる。

ただ、importした状態でpyxファイルを書き換えても、直ちに反映されるわけではなく、通常は一度IPythonを終了して再起動する必要がある。(O'REILLYのCython本にも度々そういう箇所があるが、一度IPythonを終了するよう記述がある)

非常に面倒臭かったが、一々抜けなくても良い方法がある。

reload_support=Trueを引数に与えてpyximport.installを呼び出せば良い。

import pyximport
pyximport.install(reload_support=True)
import hogepyx

これでhogepyx.pyxを変更した際には

reload(hogepyx)

とすれば、再度コンパイルが走る。

こんなに便利なのにCython本に載ってないのはどういうわけだろう。機能追加が最近だったのか、実は推奨していない理由があるのか。


IPythonを開く際に自動でpyximportが動くようにしてしまうと都合が良い。
シェル上で

ipython profile create cython

するとコンフィグファイルのパスが表示されるので、そのファイルを開き、
開いたファイルに以下の4行を付け加える

c.InteractiveShellApp.exec_lines = [
    'import pyximport',
    'pyximport.install(reload_support=True)'
]

IPythonを立ち上げる際に

ipython --profile=cython

とすれば、立ち上がる際にpyximportがimport、installされる。

Cython ―Cとの融合によるPythonの高速化

Cython ―Cとの融合によるPythonの高速化