python 17 lines · 5 steps

A reusable timing context manager in Python

Wrap any block in a with-statement to measure its wall-clock time and report it automatically.

Explained by highlit
1import time
2from contextlib import contextmanager
3 
4 
5@contextmanager
6def timer(label="elapsed", logger=None):
7 start = time.perf_counter()
8 result = {"seconds": None}
9 try:
10 yield result
11 finally:
12 result["seconds"] = time.perf_counter() - start
13 message = f"{label}: {result['seconds'] * 1000:.2f}ms"
14 if logger is not None:
15 logger.info(message)
16 else:
17 print(message)
01 / 01
STEP 01

Walkthrough

Space play step click any line
Three takeaways
  1. 1The @contextmanager decorator turns a single-yield generator into a full with-block protocol.
  2. 2Putting cleanup in a finally clause guarantees timing runs even when the wrapped code raises.
  3. 3Yielding a mutable object lets the caller read results the manager fills in after the block ends.

Related explainers

Share this explainer

Here's the card — post it anywhere.

A reusable timing context manager in Python — share card
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code