fork(2) download
  1. # Temporarily modify variable and execute within updated environment.
  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, k, thunk=lambda: None):
  21. if k not in m:
  22. m[k] = thunk()
  23. return m[k]
  24.  
  25. def memo(f, keyfunc=lambda x: x):
  26. m = {}
  27. def wrapper(*args):
  28. return setdelayed(m, keyfunc(args), lambda: f(*args))
  29. return wrapper
  30.  
  31. # Main.
  32.  
  33. fib = Parameter(lambda n: fib()(n-2) + fib()(n-1) if n > 1 else n)
  34.  
  35. def make_f(f):
  36. return lambda: fib.bind(f, lambda: print(fib()(30)))
  37.  
  38. def time_f(thunk):
  39. t = process_time()
  40. thunk()
  41. print('Elapsed: {:.6f}s'.format(process_time() - t))
  42.  
  43. time_f(make_f(memo(fib())))
  44. time_f(make_f(fib()))
Success #stdin #stdout 0.59s 14072KB
stdin
Standard input is empty
stdout
832040
Elapsed: 0.000000s
832040
Elapsed: 0.503090s