2

我正在尝试加快我的代码速度。最大的问题是我有几个嵌套循环(它们必须迭代超过 25000 个单元)。然而,当我试图摆脱这些嵌套循环时,我得到了不同的结果,我似乎不明白为什么。

这是嵌套循环之一:

for i in range(N):
    for j in range(N):
        # value added in sector i (month k+1)
        VA[i,k+1]= VA[i,k+1] - IO[j,i]*(Produc[i,k+1]/Produc[i,0])

这就是我为摆脱内部循环所做的事情:

for in range(N):
    VA[i,k+1]=VA[i,k+1] - np.sum(IO[:,i])*(Produc[i,k+1]/Produc[i,0])

非常感谢您的帮助。

4

1 回答 1

1

问题是分配给 VA 会将类型限制为 VA.dtype,因此如果 VA.dtype 的精度低于 .dtype 的结果,您可能会失去准确性VA[i,k+1] - IO[j,i]*(Produc[i,k+1]/Produc[i,0])

要保持这种舍入,您需要:

for i in range(N):
    # value added in sector i (month k+1)
    VA[i,k+1] -= (IO[:,i]*(Produc[i,k+1]/Produc[i,0])).astype(VA.dtype).sum()

...假设您对更准确的版本不满意!

一些更艰苦的研究表明,如果减法使数据通过 0,则无法完美模拟行为。不过我不会打扰,因为模拟细微的错误是浪费时间;)。


请注意,如果您满意

for in range(N):
    VA[i,k+1]=VA[i,k+1] - np.sum(IO[:,i])*(Produc[i,k+1]/Produc[i,0])

你也可以

VA[:,k+1] -= IO.sum(axis=0) * Produc[:,k+1] / Produc[:,0]

我认为是等价的。


请注意,这假设它N非常适合其中的许多。这可能是VA[:N, :N]VA 的一个子集,在这种情况下,这就是问题所在,您应该将所有内容裁剪到N计算范围内。

于 2013-09-20T12:36:42.393 回答