Bag of ML Words

ML = Machine Learning, Music Love, and Miscellaneous things in daily Livings

Python: Numbaによる高速化

同僚のpython expertにNumbaの存在を教えてもらいました。

Examples — numba 0.14.0-63-ge5ceea5 documentation

 

 

事前のコンパイルがいらないってのはよろしいですね。

必要そうな関数レベルだけで書けば良さそうだし、exampleみると大体使い方がわかったような気がします。

というか@jit + 引数の形という1行を足すだけですか???基本的に。

 

vanilla pythonで書いたうえでsanity checkが終わったら、1行書き足すだけでhappyに慣れるとは、どれだけindulgeすれば気が済むのか・・・

 

Cythonとの比較を・・・・と思ったら、ありますね

Numba vs Cython

Numba vs. Cython: Take 2

1行たして1000倍速い!!しゅごいいいい

 

試してみた

というわけで試してみました。自宅の古いノートPCを使って、anacondaバイナリをipython notebook上で実行しています。*1

 

f:id:Dr_KayAi:20141013120651p:plain

f:id:Dr_KayAi:20141013120700p:plain

f:id:Dr_KayAi:20141013120707p:plain

 

ということで、前評判通りですね!

あと、明示的に関数の返り値を指定しても、しなくても、この例だとあんま変わらないですねぇ・・・

 

あれ・・・?

ところが、中の関数をnumpy関数で書きかえると。

 

f:id:Dr_KayAi:20141013121625p:plain

f:id:Dr_KayAi:20141013121636p:plain

これは・・・なんということでしょう。

実際に使うときは、

  • まず単純に@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])もヤバそうです。長さインデックスは事前に抜き出しておくといいかもしれません。

 

 

 
 
toiu

*1:せっかくipytho notebookなんだから、そのままの雰囲気で記載したかったけど、やりかた分からず