Debug Tools
estimated_time_left/__init__.py
1 import time
2 import math
3 
5  def __init__(self, elapsed_time, progress, index, count):
6  self.elapsed_time = elapsed_time
7  self.progress = progress
8  self.index = index
9  self.count = count
10 
11  def time_remaining(self):
12  if (self.progress > 0):
13  return self.elapsed_time * (1/self.progress) - self.elapsed_time
14  return 0
15 
16 def format_time(seconds):
17  hours = int(seconds // 3600)
18  minutes = int((seconds % 3600) // 60)
19  seconds = int(seconds % 60)
20  return "%02d:%02d:%02d" % ( hours, minutes, seconds )
21 
22 def progress_info(progress_info, set_progress=None):
23  if set_progress:
24  set_progress(progress_info)
25 
26  return "{:>05.2f}%, {:s} of {:s}".format(
27  progress_info.progress * 100, format_time( progress_info.elapsed_time ), format_time( progress_info.time_remaining() ) )
28 
30 
31  def __init__(self, prefix_text):
32  self.progress = "00.00%, 00:05:11"
33  self.prefix_text = prefix_text
34 
35  def __call__(self, progress_info):
36  self.set_progress( progress_info )
37 
38  def set_progress(self, progress_info):
39  self.progress = "{:>05.2f}%, {:s}".format( progress_info.progress * 100, format_time( progress_info.time_remaining() ) )
40 
41  def __str__(self):
42  return "%s (%s)" % ( self.prefix_text, self.progress )
43 
44 def range(n, info_frequency=0):
45  i = 0
46  start = time.time()
47  if_counter = start
48  while i < n:
49  now = time.time()
50  if now - if_counter > info_frequency:
51  pi = ProgressInfo(now - start, float(i)/n, i, n)
52  if_counter += info_frequency
53  else:
54  pi = None
55  yield i, pi
56  i += 1
57 
58 def sequence_timer(sequence, info_frequency=0, length=None):
59  """
60  Yields tuples (item, progress_info) objects
61 
62  @param `length` if the `sequence` parameter is a generator, it does not have __len__
63  defined, then, if you know its length, you can pass it as this parameter.
64  """
65  i = 0
66  start = time.time()
67  if_counter = start
68  length = length if length else len(sequence)
69  for elem in sequence:
70  now = time.time()
71  if now - if_counter < info_frequency:
72  yield elem, None
73  else:
74  pi = ProgressInfo(now - start, float(i)/length, i, length)
75  if_counter += info_frequency
76  yield elem, pi
77  i += 1
78 
79 def file_timer(in_file, info_frequency=0):
80  i = 0
81  start = time.time()
82  if_counter = start
83  in_file.seek(0, 2)
84  length = in_file.tell()
85  in_file.seek(0)
86 
87  while True:
88  line = in_file.readline()
89  if line == "":
90  break
91 
92  now = time.time()
93  if now - if_counter < info_frequency:
94  yield line, None
95  else:
96  pi = ProgressInfo(now - start, float(in_file.tell())/length, i, length)
97  if_counter += info_frequency
98  yield line, pi
99  i += 1
100 
101 def format_seconds(seconds):
102  out_string = ''
103  comma = False
104  if seconds > 60*60:
105  hours = math.floor(seconds / (60*60))
106  seconds -= hours*60*60
107  out_string += '%g hours'%hours
108  if seconds > 60:
109  minutes = math.floor(seconds / 60)
110  seconds -= minutes*60
111  if out_string:
112  out_string += ', '
113  out_string += '%g minutes'%minutes
114  if round(seconds) > 1:
115  if out_string:
116  out_string += ', '
117  out_string += '%g seconds'%round(seconds)
118  return out_string