scipy.integrate.odeint如何加速函数评估?

1 投票
1 回答
983 浏览
提问于 2025-04-17 23:38

通常情况下,纯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更方便。

1 个回答

4

不,它并没有这样做,odeint的代码在调用你的Python函数时并没有进行任何优化。

它把你的函数包装在一个叫做 ode_function 的东西里(你可以在 这里查看),然后这个 ode_function 会通过 call_python_function 来调用你的Python函数。接着,c 语言写的函数 ode_function 会被odepack模块使用。

如果你对支持将 python 转换成 C 代码以提高速度的常微分方程(ODE)/偏微分方程(PDE)求解器感兴趣,可以看看 pydelay,它的链接是 (这里)。实际上,它是使用了 weave

撰写回答