User Tools

Site Tools


python3:lru_cache

This is an old revision of the document!


LRU Cache

Memoization is a common optimization technique where repeatedly computed values are cached for quick lookup. While memoization can be achieved by a relatively simple modification to many recursive formulations, Python3's functools library implements automatic memoization in the form of an LRU (least recently used) cache as a function decorator.

The Fibonacci Sequence

The Fibonacci sequence (fn = fn-1+fn-2) is a canonical example of a naive recursive function with exponential complexity.

The naive implementation is exponential. The second example using the LRU cache shows little growth up to moderately large values of n.

fibonacci.py
def fib(n):
    if n < 2:
        return 1
    return fib(n-1) + fib(n-2)
 
print(fib(40))
fibonacci_lru.py
from functools import *
 
@lru_cache(maxsize=None)
 
def fib(n):
    if n < 1:
        return n
    return fib(n-1) + fib(n-2)
 
print(fib(300))

Benchmarks

The naive recursive implementation fails quickly as expected (at nearly a minute for n=40).

n fibonacci.py1) fibonacci_lru.py
10 .016s .0224s
20 .0216s .0232s
30 .4664s .0216s
40 - .0248s
50 - .024s
….
100 - .0192s
200 - .024s
3002) - .0232s
1)
Python 3.5.2
2)
300 was the chosen cutoff because at 400 we encounter a “maximum recursion depth exceeded” error in Python3. Greater values can be attempted by adjusting the stack limit.
python3/lru_cache.1557249864.txt.gz · Last modified: 2019/05/07 12:24 by jguerin