mirror of
https://github.com/wagiminator/ATtiny814-USB-PD-Adapter.git
synced 2025-08-06 12:47:16 +03:00
65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
# Recursive version sys.getsizeof(). Extendable with custom handlers.
|
|
# Code from http://code.activestate.com/recipes/577504/
|
|
# Created by Raymond Hettinger on Fri, 17 Dec 2010 (MIT)
|
|
|
|
import sys
|
|
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 = sys.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 = sys.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("dict 3 elements")
|
|
d = {0:0xFF, 1:0xEE, 2:0xCC}
|
|
print(total_size(d, verbose=True))
|
|
|
|
#print("array 3 elements")
|
|
#import array
|
|
#print(total_size(array.array('B', b'\x01\x02\x03')))
|