Numba を使ってみる

2016年2月14日

はじめに

Python の JIT コンパイラ Numba を使ってみたメモ。元ネタは Micha Gorelick, Ian Ozsvald 著 "ハイパフォーマンス Python"。

環境

  • Intel Core i5 M450 2.4 GHz
  • Windows 7 64 bit
  • MSYS2 64 bit (MinGW w64)
  • Anaconda for Windows (Python 2.7)

※MinGW にも Python が入っているので、Anaconda のほうを使うようにパスを設定している。

Numba は Anaconda を提供している Continuum Analytics が提供しているもので、Anaconda に含まれている。バージョンは 0.23.1。

サンプルコード

サンプルコードは こちら から入手。

ここでは以下のものを用いる。

01_profiling/cpu_profiling

  • julia1_nopil.py

Numba の利用

Numba を利用するには、利用したい関数にデコレータ "@jit" を付ける。

from numba import jit

...

@jit
def calculate_z_serial_purepython(maxiter, zs, cs):
	...

これだけ。ただし、julia1_nopil.py では "calculate_z_serial_purepython.func_name" が用いられているが、デコレータを用いるとこれが使えなくなるので、直接関数名の文字列で置き換える。

オリジナル版の実行結果

$ python julia1_nopil.py
Length of x: 1000
Total elements: 1000000
calculate_z_serial_purepython took 12.0959999561 seconds

Numba 版の実行結果

$ python julia1_nopil_numba.py
Length of x: 1000
Total elements: 1000000
calculate_z_serial_purepython took 1.08400011063 seconds

これだけで結構速くなった。

推論された型を表示するには、次のようにする。

import numba

...

@jit
def calculate_z_serial_purepython(maxiter, zs, cs):
	...
	print("type: %s" % numba.typeof(zs))

次のように表示される。

type: reflected list(complex128)

型が間違っていれば、正しく推論できるようなヒントを与えればよい。また、直接型を指定することもできる。

注意点

Numba はリスト内包表記に対応していない (いまのところ?)。

参考文献