| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- # -*- coding: UTF-8 -*-
- import time
- import sys
- class ProgressReporter(object):
- """report progress of long-term jobs"""
- _start_time = None
- _prev_report_time = 0
- _cnt = 0
- _name = None
- _total = None
- def __init__(self, name, total=0, fout=sys.stderr):
- self._start_time = time.time()
- self._name = name
- self._total = int(total)
- self._fout = fout
- @property
- def total_time(self):
- return time.time() - self._start_time
- def trigger(self, delta=1, extra_msg='', target_cnt=None):
- if target_cnt is None:
- self._cnt += int(delta)
- else:
- self._cnt = int(target_cnt)
- now = time.time()
- if now - self._prev_report_time < 0.5:
- return
- self._prev_report_time = now
- dt = now - self._start_time
- if self._total and self._cnt > 0:
- eta_msg = '{}/{} ETA: {:.1f}'.format(self._cnt, self._total,
- (self._total-self._cnt)*dt/self._cnt)
- else:
- eta_msg = '{} done'.format(self._cnt)
- self._fout.write(u'{}: avg {:.1f}/sec'
- u', passed {:.1f}sec, {} {} \r'.format(
- self._name, self._cnt / dt, dt, eta_msg, extra_msg))
- self._fout.flush()
- def finish(self):
- """:return: total time"""
- self._fout.write('\n')
- self._fout.flush()
- return self.total_time
|