Function caching
Allows us to cache the return values of a function depending on the arguments.
It can save time when an I/O bound function is periodically called with the same arguments.
Before Python 3.2 we had to write a custom implementation. In Python 3.2+ there is an lru_cachedecorator which allows us to quickly cache and uncache the return values of a function.
Python 3.2+
Example: Fibonacci calculator with lru_cache.
from functools import lru_cache
@lru_cache(maxsize=32)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
>>> print([fib(n) for n in range(10)])
# Output: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]The maxsize argument tells lru_cache about how many recent return values to cache.
We can uncache the return values:
fib.cache_clear()Python 2+
There are a couple of ways to achieve the same effect. You can create any type of caching mechanism. It entirely depends upon your needs. Here is a generic cache:
Note: memoize won’t cache unhashable types (dict, lists, etc…) but only the immutable types. Keep that in mind when using it.
Further reading
Here is a fine article by Caktus Group in which they caught a bug in Django which occurred due to lru_cache.
Last updated