progress.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. # -*- coding: UTF-8 -*-
  2. import time
  3. import sys
  4. class ProgressReporter(object):
  5. """report progress of long-term jobs"""
  6. _start_time = None
  7. _prev_report_time = 0
  8. _cnt = 0
  9. _name = None
  10. _total = None
  11. def __init__(self, name, total=0, fout=sys.stderr):
  12. self._start_time = time.time()
  13. self._name = name
  14. self._total = int(total)
  15. self._fout = fout
  16. @property
  17. def total_time(self):
  18. return time.time() - self._start_time
  19. def trigger(self, delta=1, extra_msg='', target_cnt=None):
  20. if target_cnt is None:
  21. self._cnt += int(delta)
  22. else:
  23. self._cnt = int(target_cnt)
  24. now = time.time()
  25. if now - self._prev_report_time < 0.5:
  26. return
  27. self._prev_report_time = now
  28. dt = now - self._start_time
  29. if self._total and self._cnt > 0:
  30. eta_msg = '{}/{} ETA: {:.1f}'.format(self._cnt, self._total,
  31. (self._total-self._cnt)*dt/self._cnt)
  32. else:
  33. eta_msg = '{} done'.format(self._cnt)
  34. self._fout.write(u'{}: avg {:.1f}/sec'
  35. u', passed {:.1f}sec, {} {} \r'.format(
  36. self._name, self._cnt / dt, dt, eta_msg, extra_msg))
  37. self._fout.flush()
  38. def finish(self):
  39. """:return: total time"""
  40. self._fout.write('\n')
  41. self._fout.flush()
  42. return self.total_time