Source code for hatchet.util.timer

# Copyright 2017-2023 Lawrence Livermore National Security, LLC and other
# Hatchet Project Developers. See the top-level LICENSE file for details.
#
# SPDX-License-Identifier: MIT

from collections import OrderedDict
from contextlib import contextmanager
from datetime import datetime
from io import StringIO


[docs]class Timer(object): """Simple phase timer with a context manager.""" def __init__(self): self._phase = None self._start_time = None self._times = OrderedDict()
[docs] def start_phase(self, phase): now = datetime.now() delta = None if self._phase: delta = now - self._start_time self._times[self._phase] = delta self._phase = phase self._start_time = now return delta
[docs] def end_phase(self): assert self._phase and self._start_time now = datetime.now() delta = now - self._start_time if self._times.get(self._phase): self._times[self._phase] = self._times.get(self._phase) + delta else: self._times[self._phase] = delta self._phase = None self._start_time = None
def __str__(self): out = StringIO() out.write("Times:\n") for phase, delta in self._times.items(): out.write(" %-20s %.2fs\n" % (phase + ":", delta.total_seconds())) return out.getvalue()
[docs] @contextmanager def phase(self, name): self.start_phase(name) yield self.end_phase()