Содержимое ваших вложенных циклов for будет называться в сумме:
100*100*200*6 = 12,000,000
раз, вы можете сделать каждый расчет более эффективным или выполнять эти вычисления меньшее количество раз. У меня есть идея сократить количество вычислений, которые вы должны сделать.
Как вы настроили этот расчет, я думаю, вы можете более эффективно справиться с вашей переменной h
. Вместо зацикливания всех 200 опций с диапазоном вы можете построить только значения h, которые удовлетворяют вашему условию if h+delay[l][u][v]< 100:
, и зная, что delay[l][u][v]
уже есть (перебрав l,u,v
до h
), мы можем определить конкретный диапазон h
значений, которые мы хотим зациклить с for h in log_progress(range(0,int(100-delay[l][u][v])))
.
Похоже, что во многих случаях у вас будет только несколько значений h
, которые влияют на ваше решение, а остальные опускаются через if h+delay[l][u][v]< 100:
, поэтому пропуск этих опций с самого начала может ускорить ваш код. Ниже следует сделать, как я описал:
s2=[ ['0' for col in range(100)] for row in range(100)]
for u in log_progress (range(100)):
for v in log_progress (range(100)):
energy=0.0
#for h in log_progress(range(200)):
z=0.0
for l in log_progress(range(6)):
for h in log_progress(range(0,int(100-delay[l][u][v]))):
#if h+delay[l][u][v]< 100:
m= int(h+delay[l][u][v])
z= z + float(str(FB.collect()[l][m]))
energy= energy+z*z
s2[u][v]=round(energy)
Это должно привести вас к 200-кратному ускорению и абсолютно без ускорения, в зависимости от того, как выглядят ваши delay[l][u][v]
данные.