У меня есть функция, оптимизированная из python, которую я пытаюсь распараллелить, используя prange. Локальные переменные определяются и инициализируются в верхней части функции, за которой следует prange, управляющий локальными переменными. Однако я получаю ошибки компилятора, говорящие, что инициализированным переменным не присваивается никакого значения. Если я переключаю prange на стандартный диапазон, все компилируется и работает нормально.
Рассматриваемая функция (взята из файла большего размера):
#cython: language_level=3
cimport cython
from cython.view cimport array as cvarray
from cython.parallel import prange
from libc.math cimport fabs
@cython.wraparound(False)
@cython.boundscheck(False)
@cython.cdivision(True)
cdef double curveanalysis(double[:] curve, double[:] outlier):
cdef double cursign
cdef double newsign
cdef int c
cdef double curmax
cdef double curoutlier
cdef double quality
cdef double curstart
cdef int curvelen
cursign = 1.0
newsign = 1.0
if curve[0] !=0:
cursign = curve[0]/fabs(curve[0])
quality = 0
curmax = 0.0
curoutlier = 0
curstart = 0.0
curvelen = len(curve)
for c in prange(curvelen,nogil = True):
curoutlier += outlier[c]
if curve[c] == 0:
newsign = cursign
else:
newsign = curve[c]/fabs(curve[c])
if newsign != cursign:
quality += curmax*curoutlier/(c-curstart)
cursign = newsign
curoutlier = 0
curmax = fabs(curve[c])
curstart = c
elif fabs(curve[c]) >= curmax:
curmax = fabs(curve[c])
return quality
Когда я пытаюсь скомпилировать программу, Я получаю четыре сообщения об ошибке, что некоторые локальные переменные не назначены:
Error compiling Cython file:
------------------------------------------------------------
...
curstart = 0.0
curvelen = len(curve)
for c in prange(curvelen,nogil = True):
curoutlier += outlier[c]
if curve[c] == 0:
newsign = cursign
^
------------------------------------------------------------
mastercurveprocessing.pyx:46:22: local variable 'cursign' referenced before assignment
Это происходит также для curmax и curstart. Некоторые переменные, такие как качество и курс, не дают дополнительных ошибок компилятора. Я не видел этого раньше при использовании prange, меняет ли prange область назначенных переменных? Что мне не хватает? Как сказано выше, когда я переключаю prange на диапазон, все работает нормально (хотя и не параллельно).
Я использую Cython версии 0.29.15