Skip to content

Instantly share code, notes, and snippets.

@Techcable
Created November 15, 2021 03:40
Show Gist options
  • Select an option

  • Save Techcable/80ccee6c1011811f76a8be61fabfc8cc to your computer and use it in GitHub Desktop.

Select an option

Save Techcable/80ccee6c1011811f76a8be61fabfc8cc to your computer and use it in GitHub Desktop.
A version of sys.sizeof that functions recursively
from __future__ import print_function
from sys import getsizeof, stderr
from itertools import chain
from collections import deque
try:
from reprlib import repr
except ImportError:
pass
def total_size(o, handlers={}, verbose=False):
""" Returns the approximate memory footprint an object and all of its contents.
Automatically finds the contents of the following builtin containers and
their subclasses: tuple, list, deque, dict, set and frozenset.
To search other containers, add handlers to iterate over their contents:
handlers = {SomeContainerClass: iter,
OtherContainerClass: OtherContainerClass.get_elements}
"""
dict_handler = lambda d: chain.from_iterable(d.items())
all_handlers = {tuple: iter,
list: iter,
deque: iter,
dict: dict_handler,
set: iter,
frozenset: iter,
}
all_handlers.update(handlers) # user handlers take precedence
seen = set() # track which object id's have already been seen
default_size = getsizeof(0) # estimate sizeof object without __sizeof__
todo=[]
def sizeof(o):
if id(o) in seen: # do not double count the same object
return 0
seen.add(id(o))
s = getsizeof(o, default_size)
if verbose:
print(s, type(o), repr(o), file=stderr)
for typ, handler in all_handlers.items():
if isinstance(o, typ):
s += sum(map(sizeof, handler(o)))
break
elif hasattr(o, '__dict__'):
todo.append(o.__dict__)
elif hasattr(o, '__slots__'):
for slt in getattr(o, '__slots__'):
try:
val = getattr(o, slt)
except AttributeError:
continue
todo.append(val)
return s
todo.append(o)
total_size = 0
while todo:
total_size += sizeof(todo.pop())
return total_size
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment