import sys, gc def gettotalsizeof(*args, exclude_types=(type, type(sys))): seen = {} stack = [] for obj in args: if id(obj) not in seen: seen[id(obj)] = obj stack.append(obj) sum = 0 while stack: obj = stack.pop() sum += sys.getsizeof(obj) for obj in gc.get_referents(obj): if id(obj) not in seen and not isinstance(obj, exclude_types): seen[id(obj)] = obj stack.append(obj) return sum def gettotalinnersizeof(*args, exclude_types=(type, type(sys))): seen = {} refs = {} stack = [] for obj in args: if id(obj) not in seen: refs[id(obj)] = 0 seen[id(obj)] = obj stack.append(obj) inners = stack[:] while stack: for obj in gc.get_referents(stack.pop()): if not isinstance(obj, exclude_types): if id(obj) not in seen: refs[id(obj)] = sys.getrefcount(obj) - 3 seen[id(obj)] = obj stack.append(obj) refs[id(obj)] -= 1 stack = [] for i in seen: if refs[i] > 0: stack.append(seen[i]) del refs[i] while stack: for obj in gc.get_referents(stack.pop()): if id(obj) in refs: refs[id(obj)] += 1 if refs[id(obj)] > 0: stack.append(obj) del refs[id(obj)] sum = 0 for obj in inners: sum += sys.getsizeof(obj) for obj in gc.get_referents(obj): if id(obj) in refs: del refs[id(obj)] inners.append(obj) return sum