code: def measure_memory(cls, obj, seen=None):
          
          size = sys.getsizeof(obj)
          if seen is None:
              seen = set()
          obj_id = id(obj)
          if obj_id in seen:
              return 0
          # Important mark as seen *before* entering recursion to gracefully handle
          # self-referential objects
          seen.add(obj_id)
          if isinstance(obj, dict):
              size += sum([cls.measure_memory(v, seen) for v in obj.values()])
              size += sum([cls.measure_memory(k, seen) for k in obj.keys()])
          elif hasattr(obj, '__dict__'):
              size += cls.measure_memory(obj.__dict__, seen)
          elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)):
              size += sum([cls.measure_memory(i, seen) for i in obj])
          return size
docs: Recursively finds size of objects