8

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

我的分析表明,很多时间都花在了这个目标函数上。我已经使用 Cython 加速了该功能的某些部分。但是,该函数本身仍然是一个 Python 函数,并且重复调用它(就像leastsq这样)有一些开销。

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

Cannot convert 'object (object, object, object)' to Python object

有没有办法将 Cython 函数作为参数传递给这些需要 python 可调用对象的 Scipy 函数?

或者,就我而言,有没有办法访问底层 leastsq 实现并将 Cython 目标函数传递给它?

4

1 回答 1

6

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

你可以做的是:

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

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

(已经讨论过为此目的添加一个协议来传递低级函数指针,任何需要它的基于 Python 的系统都可以采用该协议,但是 AFAIK 的设计尚未完成,也未在Cython 和 Scipy。)

于 2012-10-12T15:06:16.740 回答