Python
Numba

Pythonを速くしたいときにやったこと -Numba編-

前置き

http://qiita.com/open_cans/items/f180ae4dc945dc7b9066
この記事の続きです。
主にミリ秒とかマイクロ秒まで気にする人向けに書いています。

numbaとは

numbaとはpythonのコードをjitコンパイラでコンパイルして速くするやつ
すごく手軽に高速化できるかなりすごい奴

numbaの使用例

sample.py
import numba

@numba.jit
def sumation(num):
  sum=0
  for i in range(num):
    sum += i
  return sum

sum = sumation(100)
print(sum)

3行目のように関数の前に
@numba.jit
と書くだけ
ここまでお手軽で高速化できるなんてすごい!!

numbaの注意点

手軽でいいんだけど使う際に注意してほしいことがいくつかあるので列挙する。

内包表記は使えない

前回の記事で内包表記最高みたいに書いてたけどnumbaでは使えない。
いないと思うけど前の記事をみて内包表記をガリガリ書いていたら内包表記からfor文に書き換えなくてはいけない

空リストは使えない

sample.py
import numba

@numba.jit
def inputList(num):
  temp=[]
  temp.append(num)
  return sum

sum = inputList(100)
print(sum)

こんな風に書くとエラーが出る
temp=[]が原因となっている

コンパイルするときの注意点

そもそも動かない関数に@numba.jitと書いてしまうとエラーが隠蔽されてしまったりしてよくわからないことになるので必ず確実に動くことを確認してから@numba.jitと書いてほしい

numbaとnumpyを組み合わせるときの注意点

numpyを使っている関数をnumbaで高速化しようとしても時々高速化できていないことがある。
どうやらnumbaもnumpyの関数でサポートしていないものもあるらしい
この記事(http://nekowarau.seesaa.net/article/428663212.html)
によるとnumbaが対応しているnumpyの関数は(http://numba.pydata.org/numba-doc/0.14/numpy_support.html)
で確認できるようだ

もし対応していない場合はその関数をスクラッチで書いてしまおう
そうすると高速化の恩恵を得ることができる。