| |
| |
|
|
| from time import perf_counter |
| from typing import Optional |
|
|
|
|
| class Timer: |
| """ |
| A timer which computes the time elapsed since the start/reset of the timer. |
| """ |
|
|
| def __init__(self) -> None: |
| self.reset() |
|
|
| def reset(self) -> None: |
| """ |
| Reset the timer. |
| """ |
| self._start = perf_counter() |
| self._paused: Optional[float] = None |
| self._total_paused = 0 |
| self._count_start = 1 |
|
|
| def pause(self) -> None: |
| """ |
| Pause the timer. |
| """ |
| if self._paused is not None: |
| raise ValueError("Trying to pause a Timer that is already paused!") |
| self._paused = perf_counter() |
|
|
| def is_paused(self) -> bool: |
| """ |
| Returns: |
| bool: whether the timer is currently paused |
| """ |
| return self._paused is not None |
|
|
| def resume(self) -> None: |
| """ |
| Resume the timer. |
| """ |
| if self._paused is None: |
| raise ValueError("Trying to resume a Timer that is not paused!") |
| |
| |
| self._total_paused += perf_counter() - self._paused |
| self._paused = None |
| self._count_start += 1 |
|
|
| def seconds(self) -> float: |
| """ |
| Returns: |
| (float): the total number of seconds since the start/reset of the |
| timer, excluding the time when the timer is paused. |
| """ |
| if self._paused is not None: |
| end_time: float = self._paused |
| else: |
| end_time = perf_counter() |
| return end_time - self._start - self._total_paused |
|
|
| def avg_seconds(self) -> float: |
| """ |
| Returns: |
| (float): the average number of seconds between every start/reset and |
| pause. |
| """ |
| return self.seconds() / self._count_start |
|
|