2

コードを高速化しようとしています。最大の問題は、私が持っているいくつかのネストされたループです (それらは 25000 セルを反復する必要があります)。ただし、これらのネストされたループを取り除こうとすると、別の結果が得られ、その理由がわかりません。

これは、ネストされたループの 1 つです。

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 が からの結果よりも精度が低い場合、精度が失われる可能性があることです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 のサブセットである可能性があります。その場合、それが問題であり、計算内でVA[:N, :N]すべてをトリミングする必要があります。N

于 2013-09-20T12:36:42.393 に答える