#!/usr/bin/env python3
# Copyright (c) OpenMMLab. All rights reserved.
"""Modified from mmcv.utils
- no changes
"""
from time import time
[docs]class TimerError(Exception):
def __init__(self, message):
self.message = message
super(TimerError, self).__init__(message)
[docs]class Timer:
"""A flexible Timer class.
Examples:
>>> import time
>>> from .timer import Timer
>>> with Timer():
>>> # simulate a code block that will run for 1s
>>> time.sleep(1)
1.000
>>> with Timer(print_tmpl='it takes {:.1f} seconds'):
>>> # simulate a code block that will run for 1s
>>> time.sleep(1)
it takes 1.0 seconds
>>> timer = Timer()
>>> time.sleep(0.5)
>>> print(timer.since_start())
0.500
>>> time.sleep(0.5)
>>> print(timer.since_last_check())
0.500
>>> print(timer.since_start())
1.000
"""
def __init__(self, start=True, print_tmpl=None):
self._is_running = False
self.print_tmpl = print_tmpl if print_tmpl else "{:.3f}"
if start:
self.start()
@property
def is_running(self):
"""bool: indicate whether the timer is running"""
return self._is_running
def __enter__(self):
self.start()
return self
def __exit__(self, type, value, traceback):
print(self.print_tmpl.format(self.since_last_check()))
self._is_running = False
[docs] def start(self):
"""Start the timer."""
if not self._is_running:
self._t_start = time()
self._is_running = True
self._t_last = time()
[docs] def since_start(self):
"""Total time since the timer is started.
Returns:
float: Time in seconds.
"""
if not self._is_running:
raise TimerError("timer is not running")
self._t_last = time()
return self._t_last - self._t_start
[docs] def since_last_check(self):
"""Time since the last checking.
Either :func:`since_start` or :func:`since_last_check` is a checking
operation.
Returns:
float: Time in seconds.
"""
if not self._is_running:
raise TimerError("timer is not running")
dur = time() - self._t_last
self._t_last = time()
return dur
_g_timers = {} # global timers
[docs]def check_time(timer_id):
"""Add check points in a single line.
This method is suitable for running a task on a list of items. A timer will
be registered when the method is called for the first time.
Examples:
>>> import time
>>> from .timer import check_time
>>> for i in range(1, 6):
>>> # simulate a code block
>>> time.sleep(i)
>>> check_time('task1')
2.000
3.000
4.000
5.000
Args:
str: Timer identifier.
"""
if timer_id not in _g_timers:
_g_timers[timer_id] = Timer()
return 0
else:
return _g_timers[timer_id].since_last_check()