from collections import Sequence, Mapping from sys import getsizeof def traverse(obj): if isinstance(obj, basestring): yield obj elif isinstance(obj, Sequence): yield obj for o in obj: for inner_o in traverse(o): yield inner_o elif isinstance(obj, Mapping): yield obj for k, v in obj.iteritems(): for inner_k in traverse(k): yield inner_k for inner_v in traverse(v): yield inner_v else: yield obj def get_total_size(x): unique = {id(o): o for o in traverse(x)} return sum(map(getsizeof, unique.values())) if __name__ == '__main__': print get_total_size({'a': 'b', 'c': ['d', 'e', 'f'], 'g': {'h': 'i'}})