是否有可能通过一个用Cython功能放到一个SciPy的功能?(Is it possible to

2019-09-24 00:15发布

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函数作为参数传递给那些需要蟒蛇可调用这些功能SciPy的?

或者说,在我的情况, 有没有什么办法来访问底层 leastsq 实施并通过用Cython目标函数呢?

Answer 1:

传递cdef的功能是不可能的目前。 传递回调函数底层Fortran代码也是不可能的,因为它与f2py不知道用Cython包裹。

你可以做的是:

  • 写下您的功能用Cython的def功能。 这些都可以通过在所有SciPy的的程序。 这不排除它来自使用Python的回调机制的额外函数调用的开销(这可能不是显著!),但你可以加快你的函数的实现,而这很可能是不够的。 只记得cdef书写用Cython代码时出现的变量,像往常一样。

  • 从复制或SciPy的的netlib.org源MINPACK代码,并直接使用他们自己。 这被由一个低级别的代替Python函数回调机制,消除剩余的函数调用的开销。

(已经有讨论关于增加对经过低级别的函数指针正是围绕这一目的,这可能是有需要的任何基于Python的系统中采用的协议,但据我所知设计未完成,而在未实现用Cython和SciPy的。)



文章来源: Is it possible to pass a cython function as argument to a scipy function?
标签: scipy cython