先日お話させて頂きましたnumba.jitの件です.私の手続きが間違ってました. 前回の河床変動の計算時間ですが,タイトルのとおり,超高速化します.100倍です. github更新しておきました.
numba.jitの使い方
- ほとんどのnumba.jitに使い方に関するサイトが説明不足です.
- 単純なループであれば,@jitと記述するのみで相当早くなります.型指定もあまり関係ないです. 例えば,https://qiita.com/toyolab/items/b5d95bd38b3c7c66b510
でも,実問題はそんなわけにはいきません.
以下のサイトを参考にしました.
http://yutori-datascience.hatenablog.com/entry/2014/12/10/123157
http://www7a.biglobe.ne.jp/~thor/novel/column/14.html
ポイントは,公式 http://numba.pydata.org/ にもあるように,
@numba.jit(nopython=True) or @numba.njit
と書くことです.nopythonオプションは,最適化できないものはエラーとして返すというものです.これがないと最適化できるものはするけど,できないものはしないのでほんとに最適化できているかわからないということです.
特に,後述の高速化できないものがループに含まれるとそのループ自体が最適化されないので,ほとんど早くなりません.
一応並列化もやってみましたが,一次元なので,逆に遅くなりましたが,大規模だと早くなるようです.
@numba.jit(nopython=True, parallel=True) # 並列化loopをrange(imax)から, numba.prange(imax) # に変更
まだ,やってないですがclassの最適化もあるようです.ちょっと面倒です.
https://stackoverflow.com/questions/38682260/how-to-nest-numba-jitclass
numba.jitで使えないもの
文字列型
一切駄目です.例えば,print(str(i))も駄目でした.
引数は駄目です。printは使えます。
lambda式
駄目です.ちょっと不便
使えます。
pandas
これも駄目です.
dictionary型
駄目です.
通常のリスト型およびその処理
すべて,numpyにしましょう.例えば,通常sumも使えません.np.sumならO.K.です
感想
- もとのpythonのコードをほとんど手を加えずに,超高速化出来るので便利です.野望が広がります.
- pythonらしいコードは書けないので,必要なdefだけ最適化すれば良いと思います.それでも,リスト内包表記や配列の演算などは普通に使えると十分です.
- なので,静的な言語の知識は若干必要かも.我々のように高級言語から入った人間にはそんなに苦労する話じゃないですが.
- numbaのエラー文がめちゃくちゃわかりにくい.エラー箇所が特定できないので,ちょっとコーディングが大変.
2020/3/7追記
より詳しい解説を下記事にしました.
computational-sediment-hyd.hatenablog.jp
computational-sediment-hyd.hatenablog.jp
2020/06追記