Files
2020-06-27 20:34:05 -07:00

50 lines
1.4 KiB
Python

# -*- 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