【问题标题】:Removing nested loops within python删除python中的嵌套循环
【发布时间】:2013-09-20 12:10:25
【问题描述】:

我正在尝试加快我的代码速度。最大的问题是我有几个嵌套循环(它们必须迭代超过 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])

非常感谢您的帮助。

【问题讨论】:

  • 使用 xrange 代替 range(对于 Python 版本
  • IO 的大小是多少?在第一种情况下(内循环),你在 j 上从 0 总结到 N-1,在第二种情况下,在 j 上总结从 0 到 len(IO)-1
  • @GrijeshChauhan:试图让你的单一代码库在你已经使用的解释器上变得非常低效,从而使其面向未来似乎是个坏主意。
  • @GrijeshChauhan,不完全是我所说的“更便携”。代码的含义和性能有很大的不同。在很多情况下,它只是具有相同的最终结果。 2to3 会更好地完成这种转换。
  • 你能举例说明两个不同的结果吗?差异是否可能是由于浮点值的截断?

标签: python numpy nested-loops


【解决方案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

【讨论】:

  • 我可以问分歧是什么吗?我有一个样本数据集,我的答案适用于其中,所以这至少是一个合理的猜测。
  • VA[:,k+1] -= IO.sum(axis=0) * Produc[:,k+1] / Produc[:,0] 在我看来是正确的。
  • 您的第一句话是不正确的:您不会通过将 分配给数组的一个项目 来更改类型。当您使用-=+= 时,您尤其不会。
  • 啊,不,这是您要添加的对象的类型,而不是您要添加到的数组的类型。所以[32] + 1.4 会变成[33],这是原始更改没有考虑的舍入误差。很容易误会,我会澄清一下语言。
  • 即使所有数组的 dtypes 相同,由于您现在正在添加/减去不同大小的值,因此结果可能会因截断而不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
相关资源
最近更新 更多