本日は
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をつかうコードをするよりもパフォーマンスが良かったです.素晴らしい!