File: timer.py

package info (click to toggle)
python-throttler 1.2.2-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 180 kB
  • sloc: python: 473; makefile: 4; sh: 2
file content (40 lines) | stat: -rw-r--r-- 1,310 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from datetime import datetime
from typing import Callable


class Timer:
    """
    Context manager for pretty printing start, end, elapsed and average times.

    Example usage:
        - https://github.com/uburuntu/throttler/blob/master/examples/example_timer.py
    """

    def __init__(self, name: str = None, verbose: bool = False, print_func: Callable = None):
        self.iteration = 1
        self.start_dt = None
        self.elapsed_all = 0.

        self.name = name
        self.verbose = verbose
        self.print = print_func or print

    def __enter__(self):
        self.start_dt = datetime.now()
        if self.verbose:
            self.print(f'{f"#{self.iteration}":>5} | {self.name or "Timer"} | begin: {self.start_dt}')

    def __exit__(self, exc_type, exc_val, exc_tb):
        curr_dt = datetime.now()
        elapsed = (curr_dt - self.start_dt).total_seconds()

        self.elapsed_all += elapsed
        average = self.elapsed_all / self.iteration

        if self.verbose:
            self.print(f'{f"#{self.iteration}":>5} | {self.name or "Timer"} |   end: {curr_dt}, elapsed: {elapsed:.2f} sec, '
                       f'average: {average:.2f} sec\n')
        else:
            self.print(f'{self.name or "Timer"} | elapsed: {elapsed:.2f} sec')

        self.iteration += 1