@@ -581,12 +581,18 @@ def add(self, code, toplevel_code=None):
581581 for subcode in filter (inspect .iscode , code .co_consts ):
582582 self .add (subcode , toplevel_code = toplevel_code )
583583
584- def trace (self , code , lineno ):
584+ def trace (self , code , lineno , prev_lineno ):
585585 memory = _get_memory (- 1 , self .backend , include_children = self .include_children ,
586586 filename = code .co_filename )
587- # if there is already a measurement for that line get the max
588- previous_memory = self [code ].get (lineno , 0 )
589- self [code ][lineno ] = max (memory , previous_memory )
587+ prev_value = self [code ].get (lineno , None )
588+ previous_memory = prev_value [1 ] if prev_value else 0
589+ previous_inc = prev_value [0 ] if prev_value else 0
590+
591+ prev_line_value = self [code ].get (prev_lineno , None ) if prev_lineno else None
592+ prev_line_memory = prev_line_value [1 ] if prev_line_value else 0
593+ #inc = (memory-prev_line_memory)
594+ #print('trace lineno=%(lineno)s prev_lineno=%(prev_lineno)s mem=%(memory)s prev_inc=%(previous_inc)s inc=%(inc)s' % locals())
595+ self [code ][lineno ] = (previous_inc + (memory - prev_line_memory ), max (memory , previous_memory ))
590596
591597 def items (self ):
592598 """Iterate on the toplevel code blocks."""
@@ -610,6 +616,7 @@ def __init__(self, **kw):
610616 self .max_mem = kw .get ('max_mem' , None )
611617 self .prevlines = []
612618 self .backend = choose_backend (kw .get ('backend' , None ))
619+ self .prev_lineno = None
613620
614621 def __call__ (self , func = None , precision = 1 ):
615622 if func is not None :
@@ -684,10 +691,15 @@ def trace_memory_usage(self, frame, event, arg):
684691 # "call" event just saves the lineno but not the memory
685692 self .prevlines .append (frame .f_lineno )
686693 elif event == 'line' :
687- self .code_map .trace (frame .f_code , self .prevlines [- 1 ])
694+ # trace needs current line and previous line
695+ self .code_map .trace (frame .f_code , self .prevlines [- 1 ], self .prev_lineno )
696+ # saving previous line
697+ self .prev_lineno = self .prevlines [- 1 ]
688698 self .prevlines [- 1 ] = frame .f_lineno
689699 elif event == 'return' :
690- self .code_map .trace (frame .f_code , self .prevlines .pop ())
700+ lineno = self .prevlines .pop ()
701+ self .code_map .trace (frame .f_code , lineno , self .prev_lineno )
702+ self .prev_lineno = lineno
691703
692704 if self ._original_trace_function is not None :
693705 self ._original_trace_function (frame , event , arg )
@@ -748,13 +760,13 @@ def show_results(prof, stream=None, precision=1):
748760 stream .write (u'=' * len (header ) + '\n ' )
749761
750762 all_lines = linecache .getlines (filename )
751- mem_old = None
763+
752764 float_format = u'{0}.{1}f' .format (precision + 4 , precision )
753765 template_mem = u'{0:' + float_format + '} MiB'
754766 for (lineno , mem ) in lines :
755767 if mem :
756- inc = ( mem - mem_old ) if mem_old else 0
757- mem_old = mem
768+ inc = mem [ 0 ]
769+ mem = mem [ 1 ]
758770 mem = template_mem .format (mem )
759771 inc = template_mem .format (inc )
760772 else :
0 commit comments