python - 如何将python函数传递给接受函数作为参数的cython函数?
问题描述
我正在根据一些评论重新表述我最初的问题(我认识到发布时问题并不像它本来可以的那样精确),希望能找到答案。
我有以下cdef函数,它在各种其他参数中接受定义为ftype的f()函数,如下所示,
%%cython
ctypedef double (*ftype) (double)
cdef cy_myfunc(int a,..., double x, ftype f):
...
cdef double result
result = f(x)
return result
我定义了一个这样的python函数:
def py_myfunc(a,..., x, f):
return cy_myfunc(a,...,x,f)
我希望能够调用py_myfunc()并将用户 python 函数作为 f 参数传递(python 函数的唯一先决条件是应该接受一个双精度并返回双精度)。这可能吗?如果是这样,如何在 cython 中实现这一点?f()函数在循环中重复使用,所以我希望它尽可能快。
解决方案
我有一段时间没有修补 cython 了。但从概念上讲,您的方法是有缺陷的。通过对只能是简单指针值的 C 类型函数进行硬编码,您限制了自己太多。python函数永远不可能那样。它总是由 Py_Object 表示,就像任何可调用的一样。
只是不要将f 声明为 ftype,而是将其声明为普通的 python 对象(或根本没有类型),然后调用它。无论如何,您需要传递的 Py_Object* 的完整语义,因为 cython 无法保证传递的函数不是完全不同的可调用函数。
推荐阅读
- docker - 如何将 PEM 证书从 ConfigMap 动态添加到 OpenShift 中的 Java cacerts?
- python - Django过滤最新文件
- java - Android 应用将 HED 与 OpenCV 和深度学习 (Java) 结合使用
- javascript - 如何测试一个 thunk 是否已通过调度?
- php - 在 WooCommerce 管理产品列表中为“每页的项目数”设置默认值
- javascript - 如何使用 react-virualized 在表格上实现无限滚动?
- react-native - 添加条件以允许扫描
- android - 是否可以在没有预览和用户交互的情况下拍照?
- python - 有没有办法强制任何函数在 Python 中不冗长?
- sql - Sql 循环遍历列的唯一元素