同僚のpython expertにNumbaの存在を教えてもらいました。
Examples — numba 0.14.0-63-ge5ceea5 documentation
事前のコンパイルがいらないってのはよろしいですね。
必要そうな関数レベルだけで書けば良さそうだし、exampleみると大体使い方がわかったような気がします。
というか@jit + 引数の形という1行を足すだけですか???基本的に。
vanilla pythonで書いたうえでsanity checkが終わったら、1行書き足すだけでhappyに慣れるとは、どれだけindulgeすれば気が済むのか・・・
Cythonとの比較を・・・・と思ったら、ありますね
1行たして1000倍速い!!しゅごいいいい
試してみた
というわけで試してみました。自宅の古いノートPCを使って、anacondaバイナリをipython notebook上で実行しています。*1
ということで、前評判通りですね!
あと、明示的に関数の返り値を指定しても、しなくても、この例だとあんま変わらないですねぇ・・・
あれ・・・?
ところが、中の関数をnumpy関数で書きかえると。
これは・・・なんということでしょう。
実際に使うときは、
- まず単純に@jitをかぶせる
- 早くならなかったら、中の関数をばらしてみる
という手続きが必要ということでしょうか?
つまりほぼMatlab-mexのような書き変えが必要ですか。とはいえ、mexと異なりメモリ構造の記載はpython(numpy)のままで行けるので、そこは大幅に楽ですよね。
困ったときのstack overflow!!
numba遅いやん!っての、ありました。
python - Optimizing access on numpy arrays for numba - Stack Overflow
回答の中で、返り値を推測できないnumpy関数があるとアカンってのがありますね。
たとえばnp.sumは推測できるけど、np.maxは推測できないとか。
Numpy Support in numba — numba 0.14.0 documentation
ここに書いてありますね。
np.dotがダメなのはつらいですなー・・・いけるかもしれません
あとハマった点
- scipy.sparseマトリックスは対象外です。事前にndarrayにばらしたりしないといけません。
- for i in xrange(len(X)) とかは良くないです。事前にL=len(X)としておきましょう
- X.shape()も使わない方が良さそうです。さらにいうとlen(X[0])もヤバそうです。長さインデックスは事前に抜き出しておくといいかもしれません。
*1:せっかくipytho notebookなんだから、そのままの雰囲気で記載したかったけど、やりかた分からず