| | |
| | from time import time |
| |
|
| |
|
| | class TimerError(Exception): |
| |
|
| | def __init__(self, message): |
| | self.message = message |
| | super(TimerError, self).__init__(message) |
| |
|
| |
|
| | class Timer: |
| | """A flexible Timer class. |
| | |
| | :Example: |
| | |
| | >>> import time |
| | >>> import annotator.uniformer.mmcv as mmcv |
| | >>> with mmcv.Timer(): |
| | >>> # simulate a code block that will run for 1s |
| | >>> time.sleep(1) |
| | 1.000 |
| | >>> with mmcv.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 = mmcv.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 |
| |
|
| | def start(self): |
| | """Start the timer.""" |
| | if not self._is_running: |
| | self._t_start = time() |
| | self._is_running = True |
| | self._t_last = time() |
| |
|
| | 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 |
| |
|
| | 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 = {} |
| |
|
| |
|
| | 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. |
| | |
| | :Example: |
| | |
| | >>> import time |
| | >>> import annotator.uniformer.mmcv as mmcv |
| | >>> for i in range(1, 6): |
| | >>> # simulate a code block |
| | >>> time.sleep(i) |
| | >>> mmcv.check_time('task1') |
| | 2.000 |
| | 3.000 |
| | 4.000 |
| | 5.000 |
| | |
| | Args: |
| | timer_id (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() |
| |
|