Рассмотрима этого фиктивного код Cython:Cython Memoryview в качестве возвращаемого значения
#!python
#cython: boundscheck=False
#cython: wraparound=False
#cython: initializedcheck=False
#cython: cdivision=True
#cython: nonecheck=False
import numpy as np
# iterator function
cdef double[:] f(double[:] data):
data[0] *= 1.01
data[1] *= 1.02
return data
# looping function
cdef double[:] _call_me(int bignumber, double[:] data):
cdef int ii
for ii in range(bignumber):
data = f(data)
return data
# helper function to allow calls from Python
def call_me(bignumber):
cdef double[:] data = np.ones(2)
return _call_me(bignumber, data)
Теперь, если я делаю Cython -a на это, он показывает заявление возврата в желтом цвете. Я делаю что-то подобное в очень критичной для производительности программе, и, согласно профилированию, это действительно замедляет мой код. Итак, зачем cython нужен python для этих операторов возврата? Аннотированный файл дает подсказку:
PyErr_SetString(PyExc_TypeError,"Memoryview return value is not initialized");
Удивительно, но поиск Google для Cython «возвращаемое значение Memoryview не инициализирован» дает нулевой результат.
Cython version 0.19.2 – HenriV
В вашем реальном коде вам нужно вернуть memoryview или изменить его на месте, как здесь? Выполнение этих изменений дает мне 40-кратное ускорение. Я не уверен, есть ли способ отключить эту проверку ... – jorgeca
Настоящий код итерационно решает обычные дифференциальные уравнения, так что да, мне нужно вернуть его. – HenriV