我正在尝试加速我的代码。最大的问题是我有几个嵌套循环(它们必须迭代超过 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])
非常感谢您的帮助。
最佳答案
问题是分配给 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
。
关于python - 删除 python 中的嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18916483/