Для 1D массива, numpy.correlate
быстрее, чем scipy.signal.correlate
, при разных размерах, я вижу постоянный 5-кратный прирост производительности при использовании numpy.correlate
. Когда два массива имеют одинаковый размер (яркая линия, соединяющая диагональ), разница в производительности становится еще более заметной (50x +).
# a simple benchmark
res = []
for x in range(1, 1000):
list_x = []
for y in range(1, 1000):
# generate different sizes of series to compare
l1 = np.random.choice(range(1, 100), size=x)
l2 = np.random.choice(range(1, 100), size=y)
time_start = datetime.now()
np.correlate(a=l1, v=l2)
t_np = datetime.now() - time_start
time_start = datetime.now()
scipy.signal.correlate(in1=l1, in2=l2)
t_scipy = datetime.now() - time_start
list_x.append(t_scipy / t_np)
res.append(list_x)
plt.imshow(np.matrix(res))
По умолчанию scipy.signal.correlate вычисляет несколько дополнительных чисел путем заполнения, и это может объяснить разницу в производительности.
>> l1 = [1,2,3,2,1,2,3]
>> l2 = [1,2,3]
>> print(numpy.correlate(a=l1, v=l2))
>> print(scipy.signal.correlate(in1=l1, in2=l2))
[14 14 10 10 14]
[ 3 8 14 14 10 10 14 8 3] # the first 3 is [0,0,1]dot[1,2,3]