Я использую cython для вычисления корреляции в моей программе python. У меня есть два набора аудиоданных, и мне нужно знать разницу во времени между ними. Второй набор вырезается в зависимости от времени начала и затем перемещается по первому набору. Существует два типа for-loops: один слайд установлен, а внутренний цикл вычисляет корреляцию в этой точке. Этот метод работает очень хорошо, и он достаточно точен.
Проблема в том, что с чистым python это занимает более одной минуты. С моим кодом cython это занимает около 17 секунд. Это все еще слишком много. У вас есть какие-то подсказки, как ускорить этот код:
import numpy as np
cimport numpy as np
cimport cython
FTYPE = np.float
ctypedef np.float_t FTYPE_t
@cython.boundscheck(False)
def delay(np.ndarray[FTYPE_t, ndim=1] f, np.ndarray[FTYPE_t, ndim=1] g):
cdef int size1 = f.shape[0]
cdef int size2 = g.shape[0]
cdef int max_correlation = 0
cdef int delay = 0
cdef int current_correlation, i, j
# Move second data set frame by frame
for i in range(0, size1 - size2):
current_correlation = 0
# Calculate correlation at that point
for j in range(size2):
current_correlation += f[<unsigned int>(i+j)] * g[j]
# Check if current correlation is highest so far
if current_correlation > max_correlation:
max_correlation = current_correlation
delay = i
return delay