只要做到在用Cython你會用C做同樣的事情,直接調用PyCObject_FromVoidPtrAndDesc
。以下是從您的鏈接移植到Cython的示例:
###### example.pyx ######
from libc.stdlib cimport malloc, free
from cpython.cobject cimport PyCObject_FromVoidPtrAndDesc
cdef int _shift_function(int *output_coordinates, double* input_coordinates,
int output_rank, int input_rank, double *shift_data):
cdef double shift = shift_data[0]
cdef int ii
for ii in range(input_rank):
input_coordinates[ii] = output_coordinates[ii] - shift
return 1
cdef void _shift_destructor(void* cobject, void *shift_data):
free(shift_data)
def shift_function(double shift):
"""This is the function callable from python."""
cdef double* shift_data = <double*>malloc(sizeof(shift))
shift_data[0] = shift
return PyCObject_FromVoidPtrAndDesc(&_shift_function,
shift_data,
&_shift_destructor)
性能應與純C版本相同。
請注意,Cyhton要求運營商&
獲取函數地址。另外,Cython缺少指針取消引用運算符*
,而是使用索引等價物(*ptr
- >ptr[0]
)。
+1只是指針笑話:-p – Will 2013-05-08 14:16:55
這似乎是正確的做! :D – 2013-05-08 14:50:50