scipy.integrate.odeint如何加速函数评估?
通常情况下,纯Python的速度大约比原生代码(比如C语言或Fortran)慢50倍,尤其是在处理简单的数学运算和紧密循环时。如果你使用像scipy.odeint这样的工具,就可以像在这个教程中描述的那样,直接用纯Python编写需要积分的函数,代码示例如下:
def f(y, t):
Si = y[0]
Zi = y[1]
Ri = y[2]
# the model equations (see Munz et al. 2009)
f0 = P - B*Si*Zi - d*Si
f1 = B*Si*Zi + G*Ri - A*Si*Zi
f2 = d*Si + A*Si*Zi - G*Ri
return [f0, f1, f2]
这个函数需要被多次计算,所以我觉得这可能会成为一个性能瓶颈,毕竟odeint这个积分器本身是用FORTRAN/ODPACK写的。
它是否使用了某种方式将函数f(y,t)
从Python转换为原生代码?(比如f2py、scipy.weave、cython等……)据我所知,odeint并不需要任何C/C++或Fortran编译器,而且不会增加我的Python脚本的初始化时间,所以可能没有使用f2py和scipy.weave。
我问这个问题是因为,或许可以考虑使用和scipy.integrate.odeint相同的方法来加速我自己代码中的紧密循环。使用odeint比使用f2py或scipy.weave更方便。