Skip to content

Commit 5ee0a90

Browse files
authored
Merge branch 'master' into master
2 parents e07aff5 + 218afbe commit 5ee0a90

3 files changed

Lines changed: 50 additions & 1 deletion

File tree

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ test:
1717
$(PYTHON) test/test_precision_import.py
1818
$(PYTHON) test/test_exception.py
1919
$(PYTHON) test/test_exit_code.py
20+
$(PYTHON) test/test_mprof.py
2021

2122
develop:
2223
pip install -e .

mprof.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,11 +432,12 @@ def plot_file(filename, index=0, timestamps=True, children=True, options=None):
432432
# plot timestamps, if any
433433
if len(ts) > 0 and timestamps:
434434
func_num = 0
435+
f_labels = function_labels(ts.keys())
435436
for f, exec_ts in ts.items():
436437
for execution in exec_ts:
437438
add_brackets(execution[:2], execution[2:], xshift=global_start,
438439
color=all_colors[func_num % len(all_colors)],
439-
label=f.split(".")[-1]
440+
label=f_labels[f]
440441
+ " %.3fs" % (execution[1] - execution[0]), options=options)
441442
func_num += 1
442443

@@ -449,6 +450,33 @@ def plot_file(filename, index=0, timestamps=True, children=True, options=None):
449450
return mprofile
450451

451452

453+
def function_labels(dotted_function_names):
454+
state = {}
455+
456+
def set_state_for(function_names, level):
457+
for fn in function_names:
458+
label = ".".join(fn.split(".")[-level:])
459+
label_state = state.setdefault(label, {"functions": [],
460+
"level": level})
461+
label_state["functions"].append(fn)
462+
463+
set_state_for(dotted_function_names, 1)
464+
465+
while True:
466+
ambiguous_labels = [label for label in state if len(state[label]["functions"]) > 1]
467+
for ambiguous_label in ambiguous_labels:
468+
function_names = state[ambiguous_label]["functions"]
469+
new_level = state[ambiguous_label]["level"] + 1
470+
del state[ambiguous_label]
471+
set_state_for(function_names, new_level)
472+
if len(ambiguous_labels) == 0:
473+
break
474+
475+
fn_to_label = { label_state["functions"][0] : label for label, label_state in state.items() }
476+
477+
return fn_to_label
478+
479+
452480
def plot_action():
453481
def xlim_type(value):
454482
try:

test/test_mprof.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import unittest
2+
3+
import mprof
4+
5+
class Test_function_labels(unittest.TestCase):
6+
def test(self):
7+
expected = {
8+
"x.z": "z",
9+
"x.y": "y",
10+
"x.b": "x.b",
11+
"f.a.b": "f.a.b",
12+
"g.a.b": "g.a.b",
13+
"g.a.c": "a.c",
14+
"b.c": "b.c",
15+
}
16+
result = mprof.function_labels(expected.keys())
17+
self.assertEqual(expected,result)
18+
19+
if __name__ == "__main__":
20+
unittest.main()

0 commit comments

Comments
 (0)