Numba кажется отличным решением для ускорения выполнения числового кода. Однако, когда есть назначения для массива Numba, кажется, медленнее, чем стандартный код Python. Рассмотрим этот пример, сравнивающий четыре альтернативы, с/без Numba, запись в массив/скаляр:
(Расчеты были очень простыми для целей, чтобы сфокусироваться на проблеме, которая является назначением скаляру и присваиванию ячейке массива)
@autojit
def fast_sum_arr(arr):
z = arr.copy()
M = len(arr)
for i in range(M):
z[i] += arr[i]
return z
def sum_arr(arr):
z = arr.copy()
M = len(arr)
for i in range(M):
z[i] += arr[i]
return z
@autojit
def fast_sum_sclr(arr):
z = 0
M = len(arr)
for i in range(M):
z += arr[i]
return z
def sum_sclr(arr):
z = 0
M = len(arr)
for i in range(M):
z += arr[i]
return z
Используя IPython% timeit для оценки четырех альтернатив, которые я получил:
In [125]: %timeit fast_sum_arr(arr)
100 loops, best of 3: 10.8 ms per loop
In [126]: %timeit sum_arr(arr)
100 loops, best of 3: 4.11 ms per loop
In [127]: %timeit fast_sum_sclr(arr)
100000 loops, best of 3: 10 us per loop
In [128]: %timeit sum_sclr(arr)
100 loops, best of 3: 2.93 ms per loop
sum_arr, который не был скомпилирован с Numba, более чем в два раза быстрее, чем fast_sum_arr, который был скомпилирован с Numba. С другой стороны, fast_sum_sclr, который был скомпилирован с Numba, более чем на два порядка быстрее, чем sum_sclr, который не был скомпилирован с Numba.
Итак, Numba отлично выполняет задачу ускорения sum_sclr, но на самом деле делает sum_arr медленнее. Единственная разница между sum_sclr и sum_arr заключается в том, что первый присваивает скаляр, а последний присваивает ячейке массива.
Я не знаю, есть ли какое-либо отношение, но я недавно прочитал следующее в блоге http://www.phi-node.com/:
"Оказывается, когда Numba сталкивается с какой-либо конструкцией, она не поддерживает напрямую, она переключается на (очень) медленный путь кода."
Автор блога получил Numba для выполнения намного быстрее, используя инструкцию if вместо Python max().
Любые идеи по этому поводу?
Спасибо,
ФС