Скользящее окно
Как считать сумму по каждым семи дням подряд, не пересчитывая всё заново.
Задача
Найти наибольшую сумму за любые семь дней подряд.
Прямолинейно: для каждого дня сложить следующие семь.
luchshaya = 0
for i in range(len(dni) - 6):
luchshaya = max(luchshaya, sum(dni[i:i + 7]))
Работает. Работы получается «длина ряда, умноженная на длину окна».
Приём
При сдвиге окна на один день меняются ровно два значения: один вошёл, другой вышел. Значит пересчитывать всё не надо.
tekushchaya = sum(dni[:okno])
luchshaya = tekushchaya
for i in range(okno, len(dni)):
tekushchaya += dni[i] - dni[i - okno]
luchshaya = max(luchshaya, tekushchaya)
Каждый день обрабатывается ровно один раз, сколько бы дней ни было в окне.
Где встречается
Средняя температура за месяц, нагрузка за час, скользящее среднее в биржевых графиках, число запросов за последнюю минуту для ограничителя частоты.
Везде, где окно едет по ряду и надо знать итог в каждом положении.
На что смотреть
Границы. Первое окно считается обычной суммой, дальше только
поправки; цикл начинается с okno, а не с нуля. Окно длиннее ряда —
отдельный случай, ответа нет.
Родственный приём
Если надо не сумму, а минимум или максимум в окне, поправками не
обойтись: вышедшее значение могло быть тем самым максимумом. Там
нужна очередь collections.deque и приём посложнее — но начинается
всё с той же мысли: не пересчитывать то, что не изменилось.