python
26 lines · 7 steps
A rolling average over a fixed window
Maintain a running sum alongside a bounded deque so each new value yields an average in constant time.
Explained by
highlit
1from collections import deque
2
3
4class RollingAverage:
5 def __init__(self, window):
6 if window <= 0:
7 raise ValueError("window must be positive")
8 self.window = window
9 self._values = deque(maxlen=window)
10 self._total = 0.0
11
12 def add(self, value):
13 if len(self._values) == self.window:
14 self._total -= self._values[0]
15 self._values.append(value)
16 self._total += value
17 return self.average
18
19 @property
20 def average(self):
21 if not self._values:
22 return None
23 return self._total / len(self._values)
24
25 def __len__(self):
26 return len(self._values)
01 / 01
STEP 01
‹ swipe to step through ›
Walkthrough
Space play
←→ step
click any line
Three takeaways
- 1Tracking a running total lets you avoid re-summing the window on every update.
- 2A deque with maxlen automatically discards old items, but you must subtract them from your total first.
- 3Exposing the average as a property keeps the computed value consistent with the stored state.
Related explainers
python
import argparse import sys from pathlib import Path
Building a subcommand CLI with argparse
cli
argparse
subcommands
Intermediate
6 steps
python
from collections.abc import Mapping from typing import Any, Iterator
Flattening nested config into dotted keys
recursion
generators
tree-traversal
Intermediate
7 steps
python
import csv import io from datetime import datetime
Streaming a CSV export in Flask
streaming
generators
csv
Intermediate
9 steps
python
import time from collections import defaultdict from threading import Lock
Sliding-window login rate limiting in Flask
rate-limiting
sliding-window
thread-safety
Intermediate
7 steps
java
import java.util.ArrayDeque; import java.util.Deque; public final class RollingAverage {
A rolling average over a sliding window
sliding-window
running-sum
deque
Intermediate
7 steps
python
from django.conf import settings from django.contrib.auth import get_user_model from django.core.mail import EmailMultiAlternatives from django.db.models.signals import post_save
Sending a welcome email with Django signals
signals
email
user-activation
Intermediate
8 steps
Share this explainer
Here's the card — post it anywhere.
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code
Embed this explainer
Drop the interactive walkthrough into a blog or docs. Views never cost a credit.
<iframe src="https://highlit.co/explainers/a-rolling-average-over-a-fixed-window-explained-python-d1e0/embed?autoplay=1" width="100%" height="520" loading="lazy" style="border:0"></iframe>
Autoplay is on by default — add ?autoplay=0 to start paused.