numbaを使うとpythonが速くなると聞いて使い方を確認してみました
numba公式
https://numba.pydata.org/
こっちを読んだ方が良い解説記事
https://qiita.com/gyu-don/items/9d223b007ca620e95abc
何故速くなるのか
LLVM IRでコンパイルしてネイティブコードとして実行することで速くするようです
LLVMについてはこちらの記事が分かりやすかったので貼っときます
https://qiita.com/Anko_9801/items/df4475fecbddd0d91ccc
2つのモード
no pythonモードとobjectモードがあり、no pythonの方が速くなります。pythonが遅い原因として型判定する事とインタプリタで逐次実行する事が挙げられるようですが、numbaのno pythonモードでは型を固定した上でコンパイルもするので最大限の高速化が得られるのに対し、objectモードでは型判定は残してコンパイルによる高速化のみを行うようです。
使い方
1. install
pipで入ります
pip install numba
2. 遅い関数
適当な重い処理を書いてみます
%%time
def hoge():
count = 0
i = 0
for k in range(10**9):
i += 1
if i >= 1000:
count = 0
return count
hoge()
Wall time: 1min 54s
遅いです
3. numba.jitを適用する
これをnumba.jitにより高速化してみます。jitとデコーレータを付ければ高速化してくれる筈です。
from numba import jit
@jit
def hoge():
count = 0
i = 0
for k in range(10**9):
i += 1
if i >= 1000:
count = 0
return count
hoge()
Wall time: 63.5 ms
上記実行時間にはコンパイルする時間が含まれていますので、再度実行すると更に速くなります。
%time hoge()
Wall time: 0 ns
4. no pythonモードを指定する
現バージョンでモード指定を省略した場合は一度no pythonモードでコンパイルし、上手くいかなかったらobjectモードで再度コンパイルして実行するようです。objectモードを使ってほしくない場合はnopython=Trueにすることでモードを指定できます。
%%time
@jit(nopython=True) # @njitと書くことも出来ます
def hoge():
count = 0
i = 0
for k in range(10**9):
i += 1
if i >= 1000:
count = 0
return count
hoge()
Wall time: 65.7 ms
レッツトライ