У меня есть циклы в моем коде, которые я хочу распараллелить
from numba import njit, prange
from time import time
@njit
def f1(n):
s = 0
for i in range(n):
for j in range(n):
for k in range(n):
s += (i * k < j * j) - (i * k > j * j)
return s
@njit
def f2(n):
s = 0
for i in prange(n):
for j in prange(n):
for k in prange(n):
s += (i * k < j * j) - (i * k > j * j)
return s
@njit(parallel=True)
def f3(n):
s = 0
for i in range(n):
for j in range(n):
for k in range(n):
s += (i * k < j * j) - (i * k > j * j)
return s
@njit(parallel=True)
def f4(n):
s = 0
for i in prange(n):
for j in prange(n):
for k in prange(n):
s += (i * k < j * j) - (i * k > j * j)
return s
for f in [f1, f2, f3, f4]:
d = time()
f(2500)
print('%.02f' % (time() - d))
Я получаю время:
27.44
27.34
26.83
13.05
Я проверил активность своего процессора, и если первые три функции были на 100%, то четвертая на ~300%.
Я не понимаю, почему указание parallel ничего не изменило, и нужно использовать prange. В документе есть пример с диапазоном.
jit
иnjit
, сnogil
и без него, и всегда получаю 11 секунд отf1
доf3
и около 2,5 с отf4
. Но afaikparallel=True
все еще экспериментальная функция. Возможно, вам следует отправить отчет об ошибке наnumba
github. - person JE_Muc   schedule 09.05.2018