more flexible progress logging
This commit is contained in:
1 parent
df463826ae
commit
449bf9a031
1 file changed
+25
-15
+25
-15
@@ -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()
|
||||||
|
|||||||
Reference in new issue
Block a user