
from math import sqrt
import random
import time
#n = [random.randint(0, 10) for i in range(10000)]
n = [3, 5, 0, 2, 1, 4, 5, 4, 1, 1, 1, 2, 5, 2, 1, 1, 5, 2, 4, 1]
print(n)
rng = 5
stddev = .0
rng_avr = .0
rng_n2 = .0
rng_elm = []
time_exe = []
tsum = .0
for i in range(len(n)):
#start_time = time.time()
rng_elm.append(n[i])
if i < rng - 1:
continue
elif i == rng - 1:
for j in rng_elm:
rng_avr += j/rng
for j in rng_elm:
rng_n2 += pow((j - rng_avr),2)
stddev = sqrt(rng_n2/(rng-1))
print ('\tstddev: %.5f' % stddev)
#time_exe.append((time.time() - start_time))
else:
rng_n2 = .0
rng_avr = .0
rng_elm.pop(0)
for j in rng_elm:
rng_avr += j/rng
for j in rng_elm:
rng_n2 += pow((j - rng_avr),2)
stddev = sqrt(rng_n2/(rng-1))
print ('\tstddev: %.5f' % stddev)
#time_exe.append((time.time() - start_time))
#for i in time_exe:
# tsum += i/len(time_exe)
#print(tsum)[3, 5, 0, 2, 1, 4, 5, 4, 1, 1, 1, 2, 5, 2, 1, 1, 5, 2, 4, 1] stddev: 1.92354 stddev: 2.07364 stddev: 2.07364 stddev: 1.64317 stddev: 1.87083 stddev: 1.87083 stddev: 1.94936 stddev: 1.30384 stddev: 1.73205 stddev: 1.64317 stddev: 1.64317 stddev: 1.64317 stddev: 2.04939 stddev: 1.64317 stddev: 1.81659 stddev: 1.81659Ну что ж, все работает. Можно переходить к следующему шагу. Удаляем все #, кроме верхней строчки. Там нужно переписать вот так:
n = [random.randint(0, 10) for i in range(10000)] #n = [3, 5, 0, 2, 1, 4, 5, 4, 1, 1, 1, 2, 5, 2, 1, 1, 5, 2, 4, 1] #print(n) rng = 5000Запускаем снова и видим что время на обработку одного шага у нас примерно равно 0.0019 секунды. И тут надо бы задать вопрос: А можно ли сделать это быстрее? Конечно можно!

from math import sqrt
import random
import time
n = [random.randint(0, 10) for i in range(100000)]
#n = [3, 5, 0, 2, 1, 4, 5, 4, 1, 1, 1, 2, 5, 2, 1, 1, 5, 2, 4, 1]
#print(n)
stddev = .0
rng = 50000
rng_sum = 0
rng_n2 = 0
rng_elm = []
time_exe = []
tsum = .0
for i in range(len(n)):
start_time = time.time()
rng_sum += n[i]
rng_n2 += n[i]*n[i]
rng_elm.append(n[i])
if i < rng - 1:
continue
elif i == rng -1:
stddev = sqrt((rng_n2 - (rng_sum*rng_sum/rng))/(rng-1))
print ('\tstddev: %.5f' % stddev)
time_exe.append((time.time() - start_time))
else:
dif = rng_elm.pop(0)
rng_sum -= dif
rng_n2 -= dif*dif
stddev = sqrt((rng_n2 - (rng_sum*rng_sum/rng))/(rng-1))
print ('\tstddev: %.5f' % stddev)
time_exe.append((time.time() - start_time))
for i in time_exe:
tsum += i/len(time_exe)
print(tsum)Можно убедиться что считается все одинаково закомментировав все как в первом куске кода и выставив rng = 5.Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.