Я довольно новичок в Cython, и я пытаюсь Cythonize некоторый мой код. У меня есть 3D-массив X
комплексных значений (который я рассматриваю как большой «стек» квадратных массивов), который имеет форму в масштабе (small, small, huge)
, и мне нужно найти местоположение и абсолютное значение значение наибольшего элемента выше диагонали. У меня сейчас исчерпывающий поиск, подобный этому:
cdef double complex[:,:,:] Xcp = X.copy()
cdef Py_ssize_t h = Xcp.shape[0]
cdef Py_ssize_t w = Xcp.shape[1]
cdef Py_ssize_t l = Xcp.shape[2]
cdef Py_ssize_t j, k, m
cdef double tmptop = 0.0
cdef Py_ssize_t[:] coords = np.zeros((3), dtype="intp")
cdef double it
for j in range(l):
for k in range(w):
for m in range(k+1, h):
it = cabs(Xcp[m, k, j])
if it > tmptop:
tmptop = it
coords[0] = m
coords[1] = k
coords[2] = j
Обратите внимание, что я получаю cabs
отсюда:
cdef extern from "complex.h":
double cabs(double complex)
Этот код уже намного быстрее, чем тот, что я имел ранее в Numpy, но я чувствую, что его можно ускорить, в частности, парализовать.
Я попытался изменить цикл так:
with nogil:
for j in prange(l):
for k in range(w):
for m in range(k+1, h):
it = abs(Xcp[m, k, j])
if it > tmptop:
tmptop = it
coords[0] = m
coords[1] = k
coords[2] = j
Хотя сейчас я получаю неправильный результат. Что здесь происходит?