Python 将scipy.integrate.ode与cython一起使用

Python 将scipy.integrate.ode与cython一起使用,python,numpy,cython,Python,Numpy,Cython,我目前正试图将我已经编写好的python代码与Cython一起使用,以期获得更好的性能。然而,我在某一点上遇到了问题 我使用scipy.interpolate.ode: TypeError:f()正好接受3个位置参数(给定2个) 可使用以下代码复制此代码: import scipy.integrate as inte import scipy.interpolate import numpy as np class model(object): def __init__(self):

我目前正试图将我已经编写好的python代码与Cython一起使用,以期获得更好的性能。然而,我在某一点上遇到了问题 我使用scipy.interpolate.ode:

TypeError:f()正好接受3个位置参数(给定2个)

可使用以下代码复制此代码:

import scipy.integrate as inte
import scipy.interpolate
import numpy as np


class model(object):
   def __init__(self):
    self.r = np.arange(10) #a variable
    self.val = np.arange(10,20) #some values already calculated
    self.interpol = scipy.interpolate.interp1d(self.r,self.val) #interpolation

   #works with python but produces an error with cython
   def do_integration(self):

       abbrev = lambda i: self.interpol(i) #this is more complex in reality

       def f(x,y,i):
           return x+abbrev(i)

       ode = inte.ode(f,None)
       ode.set_integrator('dopri5')
       ode.set_f_params(5)
       ode.set_initial_value(0,1)

       for i in np.arange(0,1,0.1):
           ode.integrate(i)
如果f是在do_集成之外定义的,那么它也适用于cython。然而,在实际代码中,我定义了4-5个lambda函数,然后在f中使用(主要是从插值中获得一些导数,可能这是一种糟糕的风格?)。因此,在do_积分之外定义f将意味着大量的工作

我想我的问题跟,, 但是,建议的解决方案不适合我:

只是定义

cpdef double f(double x,double y,double i):
给予

此处不允许使用C函数定义

由于我是Cython的新手,我不太确定错误消息的原因是什么。有人能帮我吗


非常感谢

我认为在尝试像这样先进的东西之前,你需要学习更多的Cython。它不是Python的替代品。将
f
函数定义放在一个单独的
.pdx
文件中,从经验中学习哪些可以加速,哪些不能。依赖于导入包(如scipy)的代码不是一个很好的Cython候选代码。@ElHors我可以复制它。我不认为这类代码会从Cython中获得巨大的好处,但它们通常都以良好的Python兼容性为目标,因此应该可以工作。我会将其报告为一个bug(但如何做到这一点并非100%显而易见),我认为在尝试类似这样的高级功能之前,您需要学习更多Cython。它不是Python的替代品。将
f
函数定义放在一个单独的
.pdx
文件中,从经验中学习哪些可以加速,哪些不能。依赖于导入包(如scipy)的代码不是一个很好的Cython候选代码。@ElHors我可以复制它。我不认为这类代码会从Cython中获得巨大的好处,但它们通常都以良好的Python兼容性为目标,因此应该可以工作。我会将其报告为一个bug(但如何做到这一点并非100%显而易见)