好的,非常感谢你的帮助。 IVlads使用身份的最后一个代码 sum_j sum_k a[j]*a[k] = sum_j a[j] * sum_k a[k] 最大的不同。现在,这也会小于O(N ^ 2)。 在总和之前预先计算点积使得hpaulj的numpy建议完全相同:
sum_j sum_k a[j]*a[k] = sum_j a[j] * sum_k a[k]
sum_np = 0 dotprods = np.inner(q_np,r_np) sum_rkexp = np.exp(1j * dotprods).sum() sum_np = sum_rkexp * np.exp(-1j * dotprods).sum()
两者都是关于运行时的 0.0003s 。然而,我发现还有一件事会再增加约50%,而不是计算两次指数,我将总和中的复共轭:
0.0003s
sum_np = 0 dotprods = np.inner(q_np,r_np) rkexp = np.exp(1j * dotprods) sum_rkexp = rkexp.sum() sum_np = sum_rkexp * np.conj(rkexp).sum()
在附近运行 0.0002s 。我第一次尝试使用非矢量化numpy ~4s ,这是一个加速 2*10^4 ,以及我的'真实数据'阵列 N~6000 跑来跑去 125s 我现在明白了 0.0005s ,这是一个惊人的加速 2.5*10^5 。非常感谢,IVlad和hpaulj,在最后一天学到了很多东西:) 附:我很惊讶你们有多快速回答我花了半天才跟进的东西;)
0.0002s
~4s
2*10^4
N~6000
125s
0.0005s
2.5*10^5