我正在尝试在 cython 中编写一个函数,它应该从 python 接收一个列表参数,通过在 C/C++ 中生成它的 2D 数组以某种方式操作它,然后将其作为 2D 列表返回给 python。我简化了代码来提出我的问题:
我希望c_Func
执行该过程,我可以毫无错误地编译它。第二个函数是可调用函数,但显然它不起作用。首先,我必须处理列表无法被 double*
替换的问题,其次是 py_Func
无法返回 double*< 的问题
。那么我应该如何改变这两个呢?
cdef double** c_Func(int dim,double* init_val):
cdef double** frozen_ans= <double**> malloc(dim*sizeof(double))
frozen_ans[0]=init_val
return frozen_ans
def py_Func(int dim, double* init_val):
return c_Func(dim,init_val)
最佳答案
我假设您想要操作 C/C++ 中的数据。
不要使用 malloc,因为稍后您将无法释放该指针,并且您的代码将泄漏内存。使用稍后可以由 python 处理的容器,例如 numpy 数组。
“句柄”是指当 numpy 数组最终进入 python 垃圾收集器时,python 将为您释放该内存块。
扩展 numpy 选项,您可以从 cython 中创建一个连续的 c 风格的 numpy 数组 arr
,使用其地址填充它/将其用作纯 c 代码的 c 数组 &arr[0]
(只要它不为空),然后将其作为 python numpy.ndarray 对象返回。请参阅this在 numpy 对象上方便访问。这样做的一个强大优点是 arr
可以被视为来自 C 代码的 C 数组。
在 cython 函数的末尾,如果您不想返回 numpy 数组,可以使用 arr.tolist() 方法,但这会产生开销,因为您正在创建一个新列表。
关于输入部分,你说你的函数必须接受一个python列表。它可以:
- 接受一个 numpy 数组,对其进行操作并返回它。
- 接受一个Python列表
l
,使用np.ascontigouslyarray(l)
将其转换为numpy数组,对其进行操作并返回它。在这种情况下,您会产生复制开销,但您对此无能为力。
关于python - 将输入/输出传递给 Cython 中的函数/从 Cython 中的函数传递输入/输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23620255/