@@ -61,11 +61,22 @@ def driver_jobs_total(self):
61
61
assert (self .is_driver_job ())
62
62
return self .driver_jobs_ran () + self .driver_jobs_skipped ()
63
63
64
- def merged_with (self , other ):
64
+ def merged_with (self , other , merge_by = "sum" ):
65
65
"""Return a new JobStats, holding the merger of self and other"""
66
66
merged_stats = {}
67
+ ops = {"sum" : lambda a , b : a + b ,
68
+ # Because 0 is also a sentinel on counters we do a modified
69
+ # "nonzero-min" here. Not ideal but best we can do.
70
+ "min" : lambda a , b : (min (a , b )
71
+ if a != 0 and b != 0
72
+ else max (a , b )),
73
+ "max" : lambda a , b : max (a , b )}
74
+ op = ops [merge_by ]
67
75
for k , v in self .stats .items () + other .stats .items ():
68
- merged_stats [k ] = v + merged_stats .get (k , 0.0 )
76
+ if k in merged_stats :
77
+ merged_stats [k ] = op (v , merged_stats [k ])
78
+ else :
79
+ merged_stats [k ] = v
69
80
merged_kind = self .jobkind
70
81
if other .jobkind != merged_kind :
71
82
merged_kind = "<merged>"
@@ -214,7 +225,7 @@ def load_stats_dir(path, select_module=[], select_stat=[],
214
225
215
226
216
227
def merge_all_jobstats (jobstats , select_module = [], group_by_module = False ,
217
- ** kwargs ):
228
+ merge_by = "sum" , ** kwargs ):
218
229
"""Does a pairwise merge of the elements of list of jobs"""
219
230
m = None
220
231
if len (select_module ) > 0 :
@@ -226,12 +237,12 @@ def keyfunc(j):
226
237
jobstats .sort (key = keyfunc )
227
238
prefixed = []
228
239
for mod , group in itertools .groupby (jobstats , keyfunc ):
229
- groupmerge = merge_all_jobstats (group )
240
+ groupmerge = merge_all_jobstats (group , merge_by = merge_by )
230
241
prefixed .append (groupmerge .prefixed_by (mod ))
231
242
jobstats = prefixed
232
243
for j in jobstats :
233
244
if m is None :
234
245
m = j
235
246
else :
236
- m = m .merged_with (j )
247
+ m = m .merged_with (j , merge_by = merge_by )
237
248
return m
0 commit comments