loops - 当每个循环读取最后一个循环的结果时优化 python 循环

  显示原文与译文双语对照的内容
0 0

由两个循环( 外部和内部) 组成的函数应该优化- 理想情况是用Numpy函数替换 python 循环。 内圈可以简化为( 变量 inner_loop ),但是外圈也可以改变。

问题是 inner_loop 读取向量 U,其中一个元素在每个外部循环中被改变。 如果使用匹配的Numpy函数优化外部循环,则"递归"元素( 更新 U[i] ) 将丢失。


for i in (y for y in xrange(0, n)):
 inner_loop = -np.sum(self.Y[i, :] * U) + self.Y[i, i] * U[i] + np.conjugate(self.shares[i]/U[i])
 U[i] = U_last[i] + accelerator * (1/self.Y[i,i] * inner_loop - U_last[i])

U 是矢量( n 维),U_lastself.sharesY 是一个nxn矩阵,U 。 对于那些奇怪的人来说,它是高斯Seidel潮流算法的一部分。

时间: 原作者:

0 0

因为你递归地构建了 array,所以没有。 你必须找出另外一个不是递归的算法,或者是递归部分的因素。


让我们做我们能做的尽管。

for i in (y for y in xrange(0, n)): 就相当于 for i in xrange(n) 因为 y 没有作为名称公开,所以它没有目的。

使用 U的唯一地方是通过传递给 np.sum,因这里我们可以通过执行某些预计算来简化。

  • self.Y[i, i] * U[i] 可以是 Ydiag_times_U[i],在那里 Ydiag_times_U = np.diag(Y) * U
  • np.conjugate(self.shares[i]/U[i]) 可以是 conjugate_shares_over_U[i],在那里 conjugate_shares_over_U = np.conjugate(self.shares/U)
  • U_last[i] + accelerator * (1/self.Y[i,i] * inner_loop - U_last[i]) 可以进行同样的重新安排和制造 U_last_minus_accelerator_times_U_last[i] + accelerator_over_Ydiag[i] * inner_loop 在这里,愚蠢的是

    U_last_minus_accelerator_times_U_last[i] = U_last - accelerator * U_lastaccelerator_over_Ydiag = accelerator/np.diag(self.Y)

进行更改:


Ydiag_times_U = np.diag(Y) * U
conjugate_shares_over_U = np.conjugate(self.shares/U)
inner_silliness = Ydiag_times_U + conjugate_shares_over_U
U_last_minus_accelerator_times_U_last[i] = U_last - accelerator * U_last
accelerator_over_Ydiag = accelerator/np.diag(self.Y)

for i in xrange(n):
 inner_loop = inner_silliness[i] - np.sum(self.Y[i, :] * U)
 U[i] = U_last_minus_accelerator_times_U_last[i] + accelerator_over_Ydiag[i] * inner_loop

那些是低级的变化。 此外,你可以尝试做一些代数来提取递归。 如果你担心效率,请尝试在C 中执行循环。

...