留学・音ゲー・研究備忘録

heine98の音ゲー・研究・留学の記録。PCの知識はちょっとシェルから操作できます、くらいの人間。

Numba使うとSegfault出るが?+Julia vs Python

表題の件なんですが、どうもNumbaのアップデートすれば大丈夫っぽいです。ネット見る限るPython3.4.Xあたりからの問題で、発生当時numba0.44.1、Python3.7.5でした。 アップデートはpipつかってるなら

pip install -U numba

でした。これいちいち手動でやんの。。。?

なんでこんなこと気づいたかというと現実逃避にPythonRBCのVFI書いてたんですね。本当のVFI(pol funとしてgrid上しか選ばない=非線形ソルバー使わない、Concavity使わない)

で、これ条件同じにしてもJuliaよりPython+Numbaのほうが早くね…? 100グリッド1e-6精度で

Python: 8.55s (ただしfor loop

Python+Numba: 0.62s 1.27s

Julia: 0.23s 1.80s

とかですね。全部10iterごとにmax diffの表示させてます、Juliaで真面目には書いてないけど、そこまで変なことしてないはずなんだが。なお@inbounds使った上で2回め以降の結果です。

んーでも、他の超単純な常微分方程式の数値解を求める、みたいなネットに転がってるものをコピペしてみると、普通にjulia 0.53s vs Python+Numba 1.90sとかですね。まあ、今の所あんまり細かくPythonでコード書けないし、numba使うとエラーが全然不親切だし、ターミナルからあんまり回す気にならんし juliaみたいにインタラクティブモードに入ってどうこうするってことができなくて、常にターミナルからファイル実行しなきゃいけないのは不便ですね。もしかしてちゃんとやり方あるのかな?juliaは関数で全部処理するから使い回しも簡単なんだけど、そこらへんPythonだとmoduleなんですかね。あんましわからんのよね。Juliaにもモジュールあるけどまだちゃんと使いこなせてない。

(追記:普通に無駄なArray一個消したらめちゃ早くなったし、Juliaのほうが早くなった。それでもjuliaでAllocationが少し大きすぎる気がするのでおそらく不要な部分あり。

で、まあもうこんなことで時間使うの無駄だなって感じてきたから、以下だと信じてPythonは除外する。 まず、Numbaを使えばJuliaより早くなる場面は多い。ただし制約としてNumpyの関数を明示的に使う必要があり、最初からそうしておかないと、普通のコードからNumbaように書き換える二度手間が発生する。例えば絶対値のabsは標準の関数として存在するけど、Numbaを使うならnp.absoluteと使わないと警告が出る。

また、上でも述べたように、Numbaのエラーは何なのか、少なくとも慣れてない俺にはわかりにくい。 更に、まずNumbaで回す前になしで回るか確認して、そこからNumbaを追加して計算するということになるが、そのNumbaなしの計算が苦痛。

なので、最初に投資したJuliaで今後も行くことになるだろう。まあ趣味の範囲でPython数値計算勉強するのはいいと思うけど、今から研究にPythonを使うかっていうのは選択肢から当分除外する)

ところで、古い情報だと@autojitとか使うような書き方されてるけど、もうdeplicatedらしいので、

from numba import jit

@jit

でいいっぽいですよ。