我有一个python算法来解决一个ODE。现在我注意到这段代码对于几个不同的输入参数非常慢。因此,我对代码进行了分析,结果是:
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.004 0.004 429.032 429.032 gnlse.py:153(perform_simulation)
2 0.001 0.000 429.017 214.508 _ode.py:564(integrate)
2 0.000 0.000 429.016 214.508 _ode.py:381(integrate)
2 18.985 9.492 429.016 214.508 _ode.py:1013(run)
52007 22.260 0.000 410.031 0.008 _ode.py:495(_wrap)
52007 188.766 0.004 387.243 0.007 gnlse.py:234(GNLSE_RHS)
208033 1.300 0.000 173.272 0.001 fftpack.py:46(_raw_fft)
104018 18.316 0.000 108.077 0.001 fftpack.py:195(ifft)
104015 0.857 0.000 90.410 0.001 fftpack.py:100(fft)
104015 85.626 0.001 85.626 0.001 {numpy.fft.fftpack_lite.cfftf}
104018 85.607 0.001 85.607 0.001 {numpy.fft.fftpack_lite.cfftb}
29108 25.776 0.001 25.776 0.001 {min}
530887 3.275 0.000 3.275 0.000 {numpy.core.multiarray.array}
104034 2.522 0.000 2.522 0.000 {method 'astype' of 'numpy.ndarray' objects}
算法的哪一部分可以得到最好的优化(在没有基于cProfile度量的整个代码的情况下可以得到答案吗?)?根据数据,我会说GNLSE_RHS
函数,在这个函数所花费的总时间之后是最重要的。
在这个函数中,调用fft
-函数(每次调用四次)。让它们更快而不是改进GNLSE_RHS
中的算法会更有意义吗?
所讨论的函数是
编辑:我不需要一个完善的算法,我更想知道哪个部分对运行时间的贡献最大,也就是说,提高哪个函数的速度对整体速度的改善最大?在
使用DRY (Don't repeat yourself)原理。寻找重复的代码并将其转换为变量。在
例如,多次调用
simp['linop']
和simp['fr']
,这是一次字典查找。相反,设置linop_z = simp['linop'] * z
一次,然后每次都使用linop_z
,同样地,fr = simp['fr']
。在任何更多的东西都需要展开你的方程,寻找共同的乘数,等等
我想你说得对。
GNLSE_RHS
显然是你的瓶颈。在问题是你的
percall
非常短。我猜GNLSE_RHS
是一个由scipy
包装的fortran函数。如果是这样的话,就很难将其简化。在我解决薛定谔方程(主要是虚时间传播)的方法一直是在选择最终用C实现之前,先用Python来理解算法
相关问题 更多 >
编程相关推荐