如何将python函数传递给接受函数作为参数的cython函数?

如何将python函数传递给接受函数作为参数的cython函数?,python,cython,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 我定义了一个pyth

为了找到答案,我根据一些评论重新表述了我的原稿(我意识到在发布问题时,问题并没有那么精确)。

我有以下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函数的唯一先决条件是应该接受一个double并返回double)。这可能吗?如果是这样,如何在cython实现这一点?f()函数在一个循环中重复使用,因此我希望它尽可能快。

我已经有一段时间没有修改cython了。但从概念上讲,你的方法是有缺陷的。通过硬编码一个只能是简单指针值的C型函数,您限制了自己太多。python函数永远不会是这样。它将始终由Py_对象表示,与任何可调用对象一样


只是不要将f声明为ftype,而是一个普通的python对象(或者根本没有类型),然后调用它。无论如何,您都需要传递的Py_对象*的完整语义,因为cython无法保证传递的函数不是完全不同的可调用函数。

问题的最后一句表明,您希望通过使用cython typedef,然后以
f
的形式传递Python函数,您将在
f
中以某种方式获得纯Python代码的加速。那是行不通的。如果用户编写一个Python函数并将其传递给您的
cy_fmyfunc
,Cython不会因为您是从
cdef
中调用它而加快它的速度。根据下文的建议,您最好不要尝试为
f
指定任何C级类型。为什么在对原始问题的评论中提出的解决方案/链接不能解决您的问题?基本上,您需要jit编译一些样板代码才能使其工作-这就是ctypes能够为您做的。@ead ctypes与此无关那个它没有JIT任何东西。大多数情况下,派比是这样做的。在科学计算领域还有一些更神秘的事情。@deets ctypes可以围绕Python可调用函数生成一个小的“JIT”函数,它允许您将该可调用函数转换为C函数指针。如果没有运行时代码生成,这是不可能的。