Опитвам се да ускоря кода си. Най-големият проблем са няколко вложени контура, които имам (те трябва да повторят над 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])
Благодаря ви за помощта.
Отговори:
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[:N, :N]
е подмножество на VA, в който случай това е проблемът и трябва да изрежете всичко N
в рамките на изчисленията.