将输入/输出传递给Cython中的函数

时间:2014-05-12 22:56:04

标签: python cython

我正在尝试在cython中编写一个函数,该函数应该从python接收一个list参数,通过在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)

1 个答案:

答案 0 :(得分:2)

我假设你想操纵C / C ++中的数据。

不要使用malloc,因为您以后无法释放该指针,并且您的代码会泄漏内存。请使用python稍后可以处理的容器,例如numpy数组。

使用'handle'我的意思是当numpy数组在python垃圾收集器中结束时,python将为你释放该内存块。

扩展numpy选项,你可以在cython中创建一个连续的,c风格的numpy数组arr,使用它的地址&arr[0]填充/使用纯c代码作为交流数组(只要它不是空的),然后将其作为python numpy.ndarray对象返回。有关numpy对象的便捷访问,请参阅this。这具有arr的强大优势,可以从c代码中视为c数组。

在你的cython函数结束时,如果你不想返回一个numpy数组,你可以使用arr.tolist()方法,但这会产生开销,因为你正在创建一个新的列表。 / p>

关于输入部分,您说您的函数必须接受python列表。它可以:

  • 接受一个numpy数组,操纵它并返回它。
  • 接受一个python列表l,将其转换为带有np.ascontiguousarray(l)的numpy数组,操纵它并返回它。在这种情况下,你会产生一个复制开销,但你可以做的很少。