优化(python)算法的最佳方法?

2024-10-02 14:17:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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中的算法会更有意义吗? 所讨论的函数是

^{pr2}$

编辑:我不需要一个完善的算法,我更想知道哪个部分对运行时间的贡献最大,也就是说,提高哪个函数的速度对整体速度的改善最大?在


Tags: 函数代码pyfftnumpy算法时间lite
2条回答

使用DRY (Don't repeat yourself)原理。寻找重复的代码并将其转换为变量。在

例如,多次调用simp['linop']simp['fr'],这是一次字典查找。相反,设置linop_z = simp['linop'] * z一次,然后每次都使用linop_z,同样地,fr = simp['fr']。在

任何更多的东西都需要展开你的方程,寻找共同的乘数,等等

我想你说得对。GNLSE_RHS显然是你的瓶颈。在

52007  188.766    0.004  387.243    0.007 gnlse.py:234(GNLSE_RHS)

问题是你的percall非常短。我猜GNLSE_RHS是一个由scipy包装的fortran函数。如果是这样的话,就很难将其简化。在

我解决薛定谔方程(主要是虚时间传播)的方法一直是在选择最终用C实现之前,先用Python来理解算法

相关问题 更多 >

    热门问题