【发布时间】:2015-07-30 18:07:37
【问题描述】:
我目前正在尝试优化程序。主要瓶颈实际上是在 numpy 数组上运行的相当简单的单行计算,例如:
(p-1) * c**(p-1)/(v_dt+c)**p
(p & c 这里是浮点数,v_dt 是一个 ~500 长的浮点数数组)
这个计算在我的机器上大约需要 1/50 秒
(使用 timeit 计时:1000 次循环,最好的 3 次:每个循环 21.8 毫秒)
问题是这个小函数(我还有其他几个类似的函数)在一个循环中的每次迭代中被调用大约 500 次,该循环运行大约 100 次。所以这一行突然增加了 20 分钟的运行时间。
在 python 中加速数学计算的最佳方法是什么?用python技巧可以做多少?我已经研究过 c_types 和可能的 Cython 但我该如何使用这些?我是否需要为这些瓶颈功能编写 c 代码,或者我可以使用已经编译的库(我没有 c 经验)。
非常感谢。
编辑: 我忘了提一下,我已经在研究循环的并行化选项,但仍然想直接加速这些瓶颈函数,因为这是性能关键代码
【问题讨论】:
-
我建议在深入研究微观优化之前先寻找宏观优化:您确定程序需要循环那么多次吗?嵌套循环每次都需要执行这个计算吗?有时可以保存其中一些计算以供以后参考吗?
-
也许在这里试试codereview.stackexchange.com
-
@BJH 请记住,代码审查需要完整的工作代码才能被接受。这个 sn-p 是
example code,很可能不会被很好地接收。如果您在那里发布整个场景(包括用例),那么我们非常欢迎它。 :) -
取幂通常很昂贵。而不是
(p-1) * c**(p-1)/(v_dt+c)**p,看看(p-1) * (c/(v_dt+c))**p / c是否更快。 -
当您没有为该行代码提供任何上下文时,很难提出优化建议。哪些参数因调用而异?您也许可以预先计算一些该表达式。你用结果做什么?据我们所知,可能有一些方法可以完全跳过该中间数组的计算。
标签: python arrays math numpy cython