fork(1) download
  1. # Function memoization using dynamic binding. (1.01)
  2.  
  3. from time import process_time
  4.  
  5. # Class for dynamic binding of a variable.
  6.  
  7. class Parameter:
  8. def __init__(self, v):
  9. self.v = v
  10. def __call__(self):
  11. return self.v
  12. def bind(self, v, thunk):
  13. t = self.v
  14. self.v = v
  15. thunk()
  16. self.v = t
  17.  
  18. # Memo.
  19.  
  20. def setdelayed(m, key, thunk=lambda: None):
  21. if key not in m:
  22. m[key] = thunk()
  23. return m[key]
  24.  
  25. def memo(f, keyfunc=lambda x: x):
  26. m = {}
  27. return lambda *args: setdelayed(m, keyfunc(args), lambda: f(*args))
  28.  
  29. # Main.
  30.  
  31. fib = Parameter(lambda n: fib()(n-2) + fib()(n-1) if n > 1 else n)
  32.  
  33. def make_f(f):
  34. return lambda: fib.bind(f, lambda: print(fib()(30), repr(fib())))
  35.  
  36. def time_f(thunk):
  37. t = process_time()
  38. thunk()
  39. print('Elapsed: {:.6f}s'.format(process_time() - t))
  40.  
  41. time_f(make_f(memo(fib())))
  42. time_f(make_f(fib()))
Success #stdin #stdout 0.62s 14096KB
stdin
Standard input is empty
stdout
832040 <function memo.<locals>.<lambda> at 0x15175a12ea20>
Elapsed: 0.000000s
832040 <function <lambda> at 0x15175a12e840>
Elapsed: 0.525112s