-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtimesheet.py
138 lines (122 loc) · 4.99 KB
/
timesheet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import sys
import time
class Timesheet():
'''
Represents an ordered set of absolute times
Used to measure apportionment of time through a process
'''
def __init__(self, setname=None):
'''
Capture start time
'''
self.setname = setname
if self.setname is not None:
self.checkpoints = {}
self.start_time = time.time()
def add(self, name):
'''
add an entry
'''
if self.setname is not None:
self.checkpoints[name] = time.time()
def __repr__(self):
if self.setname is None:
result = 'Empty Timesheet'
else:
'''
Add printed entry and...
loop through entries calculating relative time cost
'''
self.add('self.printed')
tmplt = '{0}: {1:.3f}s {2:>3.0f}%\n'
extra_chars = 14
total = list(self.checkpoints.values())[-1] - self.start_time
widest = max([len(k) for k in self.checkpoints])
result = '\n' + (widest + extra_chars) * '-'
result += '\n' + self.setname.center(widest + extra_chars, ' ')
result += '\n' + (widest + extra_chars) * '-' + '\n'
for i, (k, v) in enumerate(self.checkpoints.items()):
if i == 0:
elapsed = v - self.start_time
else:
elapsed = v - list(self.checkpoints.values())[i - 1]
result += tmplt.format(k.rjust(widest, ' '),
elapsed, 100 * elapsed / (total + 0.000001))
result += (widest + extra_chars) * '=' + '\n'
result += tmplt.format('Total'.rjust(widest, ' '), total, 100)
return result
class Timesheet2():
'''
Represents an ordered set of absolute times
Used to measure apportionment of time through a process, or loop
'''
def __init__(self, setname=None):
'''
Capture start time
'''
self.setname = setname
if self.setname is not None:
self.checkpoints = {}
self.start_times = [time.time()]
def restart(self):
'''
add new start time
'''
if len(self.checkpoints) == 0:
self.start_times[0] = time.time() # just refresh
else:
self.start_times.append(time.time())
def add(self, name):
'''
add an entry
'''
if self.setname is not None:
if name in self.checkpoints:
self.checkpoints[name].append(time.time())
# if this is the first entry, and we haven't restarted, auto-restart
if (list(self.checkpoints.keys()).index(name) == 0 and
len(self.start_times) < len(self.checkpoints[name])):
self.restart()
else:
self.checkpoints[name] = [time.time()]
def __repr__(self):
if self.setname is None or len(self.checkpoints) == 0:
result = 'Empty Timesheet'
else:
'''
Add printed entry and...
loop through entries calculating relative time cost
'''
result = ''
try:
tmplt = '{0}: {1:.3f}s {2:>3.0f}%\n'
extra_chars = 14
self.finishes = [cpl for cpl in list(
self.checkpoints.values())[-1]]
self.totals = [f - self.start_times[i]
for i, f in enumerate(self.finishes)]
total = sum(self.totals)
widest = max([len(k) for k in self.checkpoints])
result = '\n' + (widest + extra_chars) * '-'
result += '\n' + self.setname.center(widest + extra_chars, ' ')
result += '\n' + (widest + extra_chars) * '-' + '\n'
for i, (k, v) in enumerate(self.checkpoints.items()):
if i == 0:
elapseds = [v[j] - self.start_times[j]
for j in range(len(v))]
elapsed = sum(elapseds)
else:
elapseds = [
v[j] - list(self.checkpoints.values())[i - 1][j] for j in range(len(v))]
elapsed = sum(elapseds)
result += tmplt.format(k.rjust(widest, ' '),
elapsed, 100 * elapsed / (total + 0.000001))
result += (widest + extra_chars) * '=' + '\n'
result += tmplt.format(((str(len(self.start_times)) if len(
self.start_times) > 1 else '') + ' totals').rjust(widest, ' '), total, 100)
except Exception as e:
err_line = sys.exc_info()[-1].tb_lineno
err_msg = 'Error in Timesheet2 __repr__: ' + \
str(e) + ' on line ' + str(err_line)
result = err_msg
return result