我正在努力加快我的代码。最大的问题是我有一些嵌套循环(它们必须迭代超过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])
非常感谢你的帮助。
答案 0 :(得分:1)
问题在于,分配给VA会将类型限制为VA.dtype,因此如果VA.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
。