Python3
Numba

Numba で並列処理ができることを知ったので.

本日は

Numba のドキュメントをぼーっと眺めているとprangeというfor loop を並列することができるそうねということをしりました.

コード

import random
from numba import jit, prange
import time


@jit(nopython=True, parallel=True)
def calc_pi(NUM):
    counter = 0
    for i in prange(NUM):
        x = random.random()
        y = random.random()
        if x*x+y*y < 1.0:
            counter += 1
    pi = 4.0*counter/NUM
    return pi


def main():
    NUM = 1000000000
    start = time.time()
    pi = calc_pi(NUM)
    end = time.time()
    print("pi, {}, elapsed={}".format(pi, end-start))

if __name__ == '__main__':
    main()

jitデコレータの引数として parallel=True をいれることと,for i in range のような通常のループを for i in prange とすることで並列処理をしてくれます.parallel=Trueのキーワードを有効にするには Numba のバージョンを0.34以上にする必要があるみたいですね.

ちなみに手持ちのWindows環境で時間計測をすると2秒ほどで処理が終わりました.すごい!!!.Cythonで固めたOpenMPをつかうコードをするよりもパフォーマンスが良かったです.素晴らしい!