Я экспериментировал с @jit
и @guvectorize
Numba и обнаружил, что @guvectorize
значительно медленнее, чем @jit
. Например, у меня есть следующий код, который вычисляет скользящую среднюю:
import numpy as np
from numba import *
@guvectorize(['void(float64[:], float64[:], float64[:])'], '(n),()->(n)')
def sma(x, m, y):
n = x.shape[0]
mi = int(m)
y[:] *= np.nan
for i in range(mi-1, n):
for j in range(i-mi+1, i+1):
y[i] = x[j] if j == i-m+1 else y[i]+x[j]
y[i] /= double(mi)
@jit(float64[:](float64[:], float64))
def sma1(x, m):
n = x.shape[0]
mi = int(m)
y = np.empty(x.shape[0]) * np.nan
for i in range(mi-1, n):
for j in range(i-mi+1, i+1):
y[i] = x[j] if j == i-m+1 else y[i]+x[j]
y[i] /= double(mi)
return y
Вот код тестирования:
import movavg_nb as mv1
import numpy as np
x = np.random.random(100)
import time as t
t0 = t.clock()
for i in range(10000):
y = mv1.sma(x, 5)
print(t.clock()-t0)
t0 = t.clock()
for i in range(10000):
y = mv1.sma1(x, 5)
print(t.clock()-t0)
Я запускал это дважды, потому что Numba обычно нужно присваивать типы в первый раз. Вот результаты тестирования кода во второй раз:
17.459737999999998 # corresponding to @guvectorize
0.036977999999997735 # corresponding to @jit
Порядок величины > 450x
Вопрос: я могу понять цель @vectorize
(где входы одинаковы), но какова будет цель @guvectorize
, когда @jit
быстрее? (или что-то в моем коде замедляет его?)