search
LoginSignup
2

More than 1 year has passed since last update.

posted at

updated at

numbaでpythonを高速化する

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で入ります

terminal
pip install numba

2. 遅い関数

適当な重い処理を書いてみます

jupyter_notebook
%%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とデコーレータを付ければ高速化してくれる筈です。

jupyter_notebook
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

上記実行時間にはコンパイルする時間が含まれていますので、再度実行すると更に速くなります。

jupyter_notebook
%time hoge()
Wall time: 0 ns

4. no pythonモードを指定する

現バージョンでモード指定を省略した場合は一度no pythonモードでコンパイルし、上手くいかなかったらobjectモードで再度コンパイルして実行するようです。objectモードを使ってほしくない場合はnopython=Trueにすることでモードを指定できます。

jupyter_notebook
%%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

レッツトライ

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2