【发布时间】:2017-05-02 22:34:58
【问题描述】:
我有一些 Python 代码目前运行速度太慢而无法使用。进行了一些速度测试后,大部分时间似乎都花在了计算 corr 的数学运算上(参见下面的代码)。
import numpy as np
from multiprocessing import Pool
from contextlib import closing
def calc_cc(tlag):
global phi_t, psi_t, T
tstart = tlag-T/2
x = np.arange(tstart, tstart+T, dtype=int)
#bulk of time spent running line below calculating corr
corr = np.sum(np.abs(np.cos(phi_t[tlag+x]-psi_t[x]))-np.abs(np.sin(phi_t[tlag+x]-psi_t[x])))
def main():
global phi_t, psi_t, T
phi_t = #some large numpy array
psi_t = #another numpy array
tlag = #another numpy array
with closing(Pool(processes=5)) as p:
corr = p.map(calc_cc,tlag)
p.terminate()
if __name__ == "__main__":
main()
我花了一些时间在网上四处寻找优化我的 python 代码的方法,更具体地说是数学运算,但很多建议都是围绕使用 numpy 等包而不是在需要时使用 python 基本函数(例如使用与 sum() 相比,np.sum 大大提高了速度。现在已经到了使用 numpy 数组和 numpy 方法的地步,我不确定我还能在哪里找到额外的收益。我正在有效地尝试的公式解决方法是:
我确信必须有更好的方法来做到这一点,因此任何关于更好解决方案的指导将不胜感激:)。
【问题讨论】:
-
什么是
time_lag'? Assuming that's typo, I'd calculatephi_t[tlag+x]-psi_t[x]` 一次。对于单个值math.cos更快,但对于大型数组(许多x值)np.cos会更快。 -
是的,这是一个错字,已修复。关于数组大小(x),一般len(x) > 10000。
-
关于只计算一次phi_t[tlag+x]-psi_t[x],当它根据每个函数调用传递的tlag而变化时,如何做到这一点。编辑:哦,我明白你现在的意思了。您指的是余弦和正弦函数。这将速度提高了 20%,这是一个不错的开始! :)
标签: python arrays performance numpy vectorization