Cython множественный возврат - PullRequest
3 голосов
/ 17 октября 2011

Я хочу обернуть эту простую функцию:

       double foo(int a, int* b)
       {
          double div = ((double) a) / ((double) *b);
          *b = a + (*b);
          return div;
        } 

Я пытаюсь сделать следующее:

      cdef pyfoo(int c, int d):
         res = foo(c, &d);
         return (res, d)  

Я хочу вернуть список значений, но используяcdef это не работает, это дает мне ошибку: AttributeError no attribute pyfoo Если вместо cdef я использую def или cpdef, это работает.

Есть ли какой-нибудь способ в cython сделать это с помощью cdef?

Ответы [ 2 ]

7 голосов
/ 17 октября 2011

cdef функции не доступны для кода Python. Вот почему они быстрые: вызов функций из Python всегда медленный.

Вместо этого в решении используется cpdef, так что оно доступно как из Python, так и быстро при вызове из C. Или не вызывать его из кода Python.

1 голос
/ 17 октября 2011

Кажется, проблема в том, что cdef создает функцию с сигнатурой C и семантикой вызова C. Они не могут быть вызваны Python. cpdef должен использоваться для предоставления оболочки Python вокруг функции cdef.

Посмотрите так: cython обеспечивает мост между C и python. cdef - это C-конец моста. cpdef находится на конце моста в Python.

Есть хороший разговор о cython .

...