是否可以将cython函数作为参数传递给scipy函数?

mar*_*ako 7 cython scipy

Scipy有许多函数接受python可调用来执行某些操作.特别是,我正在使用一个数学优化函数scipy.optimize.leastsq,它接受Python可调用作为目标函数参数.leastsq在最小化过程中,可以多次调用此目标函数.

我的分析表明,该目标函数花费了大量时间.我已经使用Cython加速了函数的某些部分.但是,函数本身仍然是一个Python函数,并且重复调用它(就像leastsq)一样有一些开销.

如果函数是一个Cython函数(使用cdef而不是def),我想我可以进一步提高速度.所以我把我的调用leastsq放在Cython扩展内部并将一个Cython目标函数传递给它.但是当我这样做时,我 调用时遇到编译错误leastsq :

Cannot convert 'object (object, object, object)' to Python object
Run Code Online (Sandbox Code Playgroud)

有没有办法将Cython函数作为参数传递给需要python callables的Scipy函数?

或者,在我的情况下,有没有办法访问底层 leastsq 实现并将Cython目标函数传递给它?

pv.*_*pv. 6

cdef目前无法传递函数.将回调函数传递给底层的Fortran代码也是不可能的,因为它包含了不知道Cython的f2py.

你能做的是:

  • 将您的函数编写为Cython的def函数.这些可以传递给所有Scipy的例程.这不会消除使用Python的回调机制产生的额外函数调用开销(这可能不重要!),但是你可以加快函数的实现,这可能就足够了.只需记住cdef出现的变量,就像编写Cython代码时一样.

  • 从Scipy或netlib.org复制MINPACK源代码,并直接自己使用它们.这通过替换低级别的Python函数回调机制来消除剩余的函数调用开销.

(已经讨论过添加一个协议,用于为此目的准确传递低级函数指针,这可以被任何需要它的基于Python的系统采用,但是AFAIK设计没有完成,并且没有在Cython&Scipy.)