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

标签 python cython

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

相关文章:

python - 在 Python 中对字典使用比较运算符

python - 使用装饰器管理函数内部的属性

python - Cython 获取 C++ 对象列表的长度

python - 使用 Pyinstaller 或 Cython 从 Python 模块创建可执行文件

python - cython中def、cdef、cpdef的定义

python - reStructuredText 文档字符串中的多个返回值 (Python 3)

python - 暂时禁用 auto_now/auto_now_add

python - 如果在数组创建期间定义了 NumPy 数组的元素,为什么 Cython 需要更多 Python 调用?

python - Cython 与 numpy 性能缩放

python - 我如何检查输入是否为英文