| from collections.abc import Iterator | |
| from contextlib import contextmanager | |
| from time import perf_counter | |
| class TimingLog: | |
| def __init__(self) -> None: | |
| self._steps: dict[str, float] = {} | |
| def measure(self, name: str) -> Iterator[None]: | |
| started = perf_counter() | |
| try: | |
| yield | |
| finally: | |
| self._steps[name] = round(perf_counter() - started, 3) | |
| def to_dict(self) -> dict[str, float]: | |
| total = round(sum(self._steps.values()), 3) | |
| return {**self._steps, "total": total} | |