code: def memoize(obj):
      
      cache = obj.cache = {}
  
      @functools.wraps(obj)
      def memoizer(*args, **kwargs):
          key = str(args) + str(kwargs)
          if key not in cache:
              cache[key] = obj(*args, **kwargs)
          # only keep the most recent 100 entries
          if len(cache) > 100:
              cache.popitem(last=False)
          return cache[key]
      return memoizer
docs: Memoize objects to trade memory for execution speed
  
      Use a limited size cache to store the value, which takes into account
      The calling args and kwargs
  
      See https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize