Skip to content

Commit 6617d0e

Browse files
author
Juan Luis Cano Rodríguez
authored
Merge pull request #166 from Juanlu001/memory-deltas-redux
Memory calculation with deltas
2 parents 15a7e12 + e0668c5 commit 6617d0e

2 files changed

Lines changed: 48 additions & 9 deletions

File tree

delta_memory_test.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from memory_profiler import profile
2+
3+
4+
def gen(count):
5+
r = list(range(0,count))
6+
return r
7+
8+
_global_var = []
9+
def _gen_cache():
10+
global _global_var
11+
if not _global_var:
12+
_global_var = gen(1000000)
13+
14+
@profile(precision=4)
15+
def test():
16+
a = gen(90000)
17+
for i in range(0,3):
18+
b = i
19+
def _inner_gen():
20+
gen(1024*1024*20)
21+
h = i
22+
_gen_cache()
23+
_inner_gen()
24+
g = i
25+
26+
if __name__ == "__main__":
27+
test()

memory_profiler.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)