Я пытаюсь Cythonize простая функция, и я хочу быть в состоянии скомпилировать ее с помощью оператора nogil
. Что у меня есть (в тетради jupyter):
%%cython -a
import numpy as np
cimport numpy as np
cimport cython
from libc.math cimport exp, pi
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.cdivision(True)
cdef double[:, ::1] _gauss(Py_ssize_t yw, Py_ssize_t xw, double y0, double x0, double sy, double sx):
"""Simple normalized 2D gaussian function for rendering"""
# for this model, x and y are seperable, so we can generate
# two gaussians and take the outer product
cdef double amp = 1 / (2 * pi * sy * sx)
cdef double[:, ::1] result = np.empty((yw, xw), dtype=np.float64)
cdef Py_ssize_t x, y
for y in range(yw):
for x in range(xw):
result[y, x] = exp(-((y - y0) / sy) ** 2 / 2 - ((x - x0) / sx) ** 2 / 2) * amp
return result
def gauss(yw, xw, y0, x0, sy, sx):
return _gauss(yw, xw, y0, x0, sy, sx)
Что компилируется нормально Если я изменю первую строку cdef
на:
...
cdef double[:, ::1] _gauss(Py_ssize_t yw, Py_ssize_t xw, double y0, double x0, double sy, double sx) nogil:
...
Тогда компиляция завершается неудачно, потому что первая и третья строки cdef
взаимодействуют с интерпретатором python, и я не уверен почему (особенно для первой).