def test_simple_format(self): t, u = rescale_time(6, unit='s') self.assertEqual((t, u), (6, 's')) t, u = rescale_time(6, unit='ms') self.assertEqual((t, u), (6000, 'ms')) t, u = rescale_time(6, unit='min') self.assertEqual((t, u), (0.1, 'min'))
def test_auto_format(self): t, u = rescale_time(6, unit='a') self.assertEqual((t, u), (6, 's')) t, u = rescale_time(0.006, unit='auto') self.assertEqual((t, u), (6, 'ms')) t, u = rescale_time(6000, unit='AUTO') self.assertEqual((t, u), (100, 'min'))
def wrapped(*args, **kwargs): start = counter() return_value = _f(*args, **kwargs) interval = counter() - start wrapped.interval = interval if print_fn is not None: nonlocal name if name is None: name = _f.__name__ + ': ' t, u = rescale_time(interval, unit=unit) print_str = f'{name}{t:.3g} {u}' print_fn(print_str) return return_value
def __next__(self): try: now = counter() if self._last: interval = now - self._last self.intervals.append(interval) t, u = rescale_time(interval, self.unit) self.iteration_print_fn( f'iteration {self.num_iterations:4}: {t:.3g} {u}') self._last = now return next(self.iterable) except StopIteration: self.print_summary() raise StopIteration
def print_summary(self): """ Print statistics of times elapsed in each iteration It is called automatically when the iteration ends. Use `summary_print_fn` argument in the constructor to control if and where the summary is printed. """ # Leave an empty line if iterations and summary are printed to # the same output. if self.iteration_print_fn == self.summary_print_fn: print_str = '\n' else: print_str = '' if self.num_iterations == 0: print_str = 'no iterations' elif self.num_iterations == 1: t, u = rescale_time(self.intervals[0], unit=self.unit) print_str += f'one iteration: {t:.3g} {u}' else: t_total, u_total = rescale_time(self.total, self.unit) t_median, u = rescale_time(median(self.intervals), self.unit) t_min, _ = rescale_time(min(self.intervals), u) t_mean, _ = rescale_time(mean(self.intervals), u) t_max, _ = rescale_time(max(self.intervals), u) t_std, _ = rescale_time(stdev(self.intervals), u) print_str += f'total {self.num_iterations} iterations ' print_str += f'in {t_total:.3g} {u_total}\n' print_str += f'min/median/max: ' \ f'{t_min:.3g}' \ f'/{t_median:.3g}' \ f'/{t_max:.3g} {u}\n' print_str += f'average (std): ' \ f'{t_mean:.3g} ' \ f'({t_std:.3g}) {u}' self.summary_print_fn(print_str)
def __exit__(self, exc_type, exc_val, exc_tb): self._interval = self.interval t, u = rescale_time(self.interval, self.unit) print_str = f"{self.name}{t:.3g} {u}" self._print_fn(print_str)