gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:13:55 25 4
gpt4 key购买 nike

我正在尝试在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com