Python 将scipy.integrate.ode与cython一起使用
我目前正试图将我已经编写好的python代码与Cython一起使用,以期获得更好的性能。然而,我在某一点上遇到了问题 我使用scipy.interpolate.ode: TypeError:f()正好接受3个位置参数(给定2个) 可使用以下代码复制此代码: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):
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%显而易见)