|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""Timing functions.""" |
|
|
|
|
|
import contextlib |
|
|
import datetime |
|
|
import time |
|
|
|
|
|
|
|
|
class Timer(object): |
|
|
"""Simple timer.""" |
|
|
|
|
|
def __init__(self): |
|
|
self.total_time = 0.0 |
|
|
self.calls = 0 |
|
|
self.start_time = 0.0 |
|
|
self.diff = 0.0 |
|
|
self.average_time = 0.0 |
|
|
|
|
|
def add_diff(self, diff, n=1, average=True): |
|
|
self.total_time += diff |
|
|
self.calls += n |
|
|
self.average_time = self.total_time / self.calls |
|
|
return self.average_time if average else self.diff |
|
|
|
|
|
@contextlib.contextmanager |
|
|
def tic_and_toc(self, n=1, average=True): |
|
|
try: |
|
|
yield self.tic() |
|
|
finally: |
|
|
self.toc(n, average) |
|
|
|
|
|
def tic(self): |
|
|
self.start_time = time.time() |
|
|
return self |
|
|
|
|
|
def toc(self, n=1, average=True): |
|
|
self.diff = time.time() - self.start_time |
|
|
return self.add_diff(self.diff, n, average) |
|
|
|
|
|
|
|
|
def get_progress(timer, step, max_steps): |
|
|
"""Return the progress information.""" |
|
|
eta_seconds = timer.average_time * (max_steps - step) |
|
|
eta = str(datetime.timedelta(seconds=int(eta_seconds))) |
|
|
progress = (step + 1.0) / max_steps |
|
|
return "< PROGRESS: {:.2%} | SPEED: {:.3f}s / iter | ETA: {} >".format( |
|
|
progress, timer.average_time, eta |
|
|
) |
|
|
|