我正在使用Python和scipy包中的odeint来解决大量(约10e6)耦合ODE。方程组可以表示为一些矩阵乘法的总和,我使用numpy和blas支持进行计算。我的问题是这需要很长时间。当我对代码进行分析时,我发现大部分时间都花在odeint上,而不是评估rhs。以下是分析器中消耗时间最多的五个调用:
ncalls tottime percall cumtime percall filename:lineno(function)
5 1547.915 309.583 1588.170 317.634 {scipy.integrate._odepack.odeint}
60597 11.535 0.000 23.751 0.000 terms3D.py:5(two_body_evolution)
121194 11.242 0.000 11.242 0.000 {numpy.core._dotblas.dot}
60597 10.145 0.000 15.460 0.000 generator.py:13(Gs2)
121203 3.615 0.000 3.615 0.000 {method 'repeat' of 'numpy.ndarray' objects}
rhs基本上由two_body_evolution和Gs2组成。这个配置文件包含大约7000个耦合的ODE,而这是大约4000个ODE的相同情况:
ncalls tottime percall cumtime percall filename:lineno(function)
5 259.427 51.885 273.316 54.663 {scipy.integrate._odepack.odeint}
30832 3.809 0.000 7.864 0.000 terms3D.py:5(two_body_evolution)
61664 3.650 0.000 3.650 0.000 {numpy.core._dotblas.dot}
30832 3.464 0.000 5.637 0.000 generator.py:13(Gs2)
61673 1.280 0.000 1.280 0.000 {method 'repeat' of 'numpy.ndarray' objects}
我的主要问题是,odeint中的“隐藏”时间随着方程数量的增加而急剧增加。你有什么想法,为什么会这样,并且如何提高性能?
感谢您的时间。
Oscar Åkerlund