趣味で計算流砂水理

Computational Sediment Hydraulics for Fun

numba.jitの衝撃:5分 ⇒ 3秒

先日お話させて頂きましたnumba.jitの件です.私の手続きが間違ってました. 前回の河床変動の計算時間ですが,タイトルのとおり,超高速化します.100倍です. github更新しておきました.

github.com

numba.jitの使い方

でも,実問題はそんなわけにはいきません.

以下のサイトを参考にしました.

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))も駄目でした.

lambda式

駄目です.ちょっと不便

pandas

これも駄目です.

dictionary型

駄目です.

通常のリスト型およびその処理

すべて,numpyにしましょう.例えば,通常sumも使えません.np.sumならO.K.です

感想

  • もとのpythonのコードをほとんど手を加えずに,超高速化出来るので便利です.野望が広がります.
  • pythonらしいコードは書けないので,必要なdefだけ最適化すれば良いと思います.それでも,リスト内包表記や配列の演算などは普通に使えると十分です.
  • なので,静的な言語の知識は若干必要かも.我々のように高級言語から入った人間にはそんなに苦労する話じゃないですが.
  • numbaのエラー文がめちゃくちゃわかりにくい.エラー箇所が特定できないので,ちょっとコーディングが大変.