Welcome, guest | Sign In | My Account | Store | Cart
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__

   
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
       
return s

   
return sizeof(o)


##### Example call #####

if __name__ == '__main__':
    d
= dict(a=1, b=2, c=3, d=[4,5,6,7], e='a string of chars')
   
print(total_size(d, verbose=True))

Diff to Previous Revision

--- revision 2 2010-12-17 23:30:09
+++ revision 3 2012-11-23 23:57:31
@@ -1,7 +1,11 @@
+from __future__ import print_function
 
from sys import getsizeof, stderr
 
from itertools import chain
 
from collections import deque
-import reprlib
+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.
@@ -33,7 +37,7 @@
         s = getsizeof(o, default_size)
 
         if verbose:
-            print(s, type(o), reprlib.repr(o), file=stderr)
+            print(s, type(o), repr(o), file=stderr)
 
         for typ, handler in all_handlers.items():
             if isinstance(o, typ):

History