Source code for capytaine.tools.timer

"""A simple timer class used to measure the time spent in various parts of the BEM solver."""

from functools import wraps
import time

[docs] class Timer: """A simple timer class that can be used as context manager or as decorator using `wraps_function` method Example ------- timer = Timer() with timer: sleep(1.0) print(timer.total) # 1.0... @timer.wraps_function def my_function(): sleep(0.5) my_function() print(timer.total) # 1.5... my_function() print(timer.total) # 2.0... print(timer.timings) # [1.0, 0.5, 0.5] """ def __init__(self, timings=None): if timings is None: self.timings = [] else: self.timings = timings def __repr__(self): return f"Timer({self.timings})" @property def nb_timings(self): return len(self.timings) @property def total(self): return sum(self.timings) @property def mean(self): if self.nb_timings == 0: return float('nan') else: return self.total/self.nb_timings def __enter__(self): self.start_time = time.perf_counter() def __exit__(self, *exc): self.timings.append(time.perf_counter() - self.start_time)
[docs] def wraps_function(self, f): @wraps(f) def wrapped_f(*args, **kwargs): with self: return f(*args, **kwargs) return wrapped_f