more flexible progress logging

This commit is contained in:
stefan committed 2026-06-22 00:06:06 +09:00
1 parent df463826ae
commit 449bf9a031
1 file changed
+25 -15
+25 -15
View File
@@ -198,25 +198,35 @@ class Log:
"""Log an error message.""" """Log an error message."""
self.log('E', message) self.log('E', message)
def progress(self):
class Progress:
def __init__(self, l): self.l = l
def __enter__(self):
self.start_time = time.perf_counter()
self.lastlog_time = self.start_time
self.log_interval = 5
return self
def update(self, completion: float, msg: str = ''):
assert completion > 0 and completion <= 1
current_time = time.perf_counter()
if current_time > self.lastlog_time + self.log_interval:
elapsed_time = current_time - self.start_time
total_time = elapsed_time / completion
rem_time = total_time - elapsed_time
self.l.log(':', f'{msg} - {completion*100:.0f}% done {hr_time(elapsed_time)} elapsed {hr_time(rem_time)} remaining')
self.log_interval = min(600, int(self.log_interval*1.5))
self.lastlog_time = current_time
def __exit__(self, *args): pass
return Progress(self)
def range(self, *args): def range(self, *args):
"""A generator that operates just like the ``range()`` built-in, and also occasionally logs the progress """A generator that operates just like the ``range()`` built-in, and also occasionally logs the progress
and compute time estimates.""" and compute time estimates."""
elems = len(range(*args)) elems = len(range(*args))
start_time = time.perf_counter() with self.progress() as p:
lastlog_time = start_time for elem, i in enumerate(range(*args)):
log_interval = 5 yield i
for elem, i in enumerate(range(*args)): p.update((elem + 1) / elems)
yield i
current_time = time.perf_counter()
if current_time > lastlog_time + log_interval:
done = (elem + 1) / elems
elapsed_time = current_time - start_time
total_time = elapsed_time / done
rem_time = total_time - elapsed_time
self.log(
':', f'{done*100:.0f}% done {hr_time(elapsed_time)} elapsed {hr_time(rem_time)} remaining')
log_interval = min(600, int(log_interval*1.5))
lastlog_time = current_time
log = Log() log = Log()