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

标签 scipy cython

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

有什么方法可以将 Cython 函数作为参数传递给这些需要 python 可调用函数的 Scipy 函数?

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

最佳答案

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

你可以做的是:

  • 将你的函数写成 Cython 的 def功能。这些可以传递给所有 Scipy 的例程。这并没有消除使用 Python 的回调机制带来的额外函数调用开销(这可能并不重要!),但是你 可以加快功能的实现,这可能就足够了。只要记住 cdef像往常一样在编写 Cython 代码时出现的变量。
  • 从 Scipy 或 netlib.org 复制MINPACK 源代码,然后自己直接使用它们。这通过将 Python 函数回调机制替换为低级机制来消除剩余的函数调用开销。

  • (已经讨论过添加一个协议(protocol)来准确地传递低级函数指针,这可以被任何需要它的基于 Python 的系统采用,但是 AFAIK 的设计还没有完成,也没有在Cython 和 Scipy。)

    关于scipy - 是否可以将 cython 函数作为参数传递给 scipy 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12847632/

    相关文章:

    python - 使用 scipy.optimize.basinhopping 时 'minimization_failures' 的含义?

    python - Python/Cython 中的快速 n 维稀疏数组

    python-3.x - 在没有预安装 numpy 的情况下将 numpy.get_include() 参数添加到 setuptools

    python - numpy/scipy 中牛顿力的最高效计算

    python - 在 cython cell magic 中调用 cdef 函数

    Python PyUSB HID 功能报告

    python - 将 ctypes 结构传递给 cython

    Python:分类数据的排序相关性

    python - 稀疏矩阵中非零值的平均值?

    python - 在 scipy python 中使用 UnivariateSpline 拟合数据