Source code for processfiles.timing
import os
import ast
import timeit
import datetime
from processfiles.filetools import write_to_file_with_retries, open_file_with_retries
[docs]class TimeTracker:
"""
Tracks progress and displays estimated finish time.
Usage:
>>> timer = TimeTracker('outfolder')
>>> items = [1, 2, 3]
>>> for item in items:
>>> timer.time_estimate(len(items))
"""
[docs] def __init__(self, folder, restart=False):
if folder is None:
self.folder = os.getcwd()
else:
self.folder = folder
self.time_path = os.path.join(self.folder, 'time.txt')
if restart:
self.delete_previous_time()
self.load_time()
self.start_timer()
[docs] def time_estimate(self, total_num_items):
self._increment_time_and_items_completed()
items_remaining = total_num_items - self.items_completed
time_per_item = self.time / self.items_completed
finish_time = datetime.datetime.now() + datetime.timedelta(seconds=items_remaining * time_per_item)
print(f'Completed {self.items_completed}/{total_num_items} ({self.items_completed/total_num_items:.0%}) Estimated finish: {finish_time}', end='\r')
[docs] def start_timer(self):
self.start_time = timeit.default_timer()
[docs] def load_time(self):
self.original_time, self.items_completed = _load_time(self.time_path)
self.time = self.original_time
def _increment_time_and_items_completed(self):
self.time = timeit.default_timer() - self.start_time + self.original_time
self.items_completed += 1
[docs] def save_time(self):
_save_time(self.time_path, self.time, self.items_completed)
[docs] def delete_previous_time(self):
_delete_time_file(self.time_path)
def _delete_time_file(time_filepath):
if os.path.exists(time_filepath):
os.remove(time_filepath)
def _save_time(time_filepath, time, items_completed):
time_dict = {
'time': time,
'items_completed': items_completed
}
write_to_file_with_retries(time_filepath, time_dict)
def _load_time(time_filepath):
if not os.path.exists(time_filepath):
return 0, 0
time_str = open_file_with_retries(time_filepath)
time_dict = ast.literal_eval(time_str)
if not isinstance(time_dict, dict):
raise ValueError('got other than dictionary in time file')
return time_dict['time'], time_dict['items_completed']