表題の件なんですが、どうもNumbaのアップデートすれば大丈夫っぽいです。ネット見る限るPython3.4.Xあたりからの問題で、発生当時numba0.44.1、Python3.7.5でした。 アップデートはpipつかってるなら
pip install -U numba
でした。これいちいち手動でやんの。。。?
なんでこんなこと気づいたかというと現実逃避にPythonでRBCの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
でいいっぽいですよ。