searching in list

Ian Kelly ian.g.kelly at gmail.com
Mon May 30 12:32:27 EDT 2011


On Mon, May 30, 2011 at 7:41 AM, Chris Angelico <rosuav at gmail.com> wrote:
> If you're always going to look them up by the argument, the best way
> would be to use a dictionary:
> cache={arg1: res1, arg2: res2, ...}
>
> Then you can search with a simple: cache[arg135]
>
> You can add things with: cache[arg135]=res135
>
> This works best if the argument is an immutable and fairly simple
> type. For instance, you could calculate Fibonacci numbers in a naive
> and straightforward way:
>
> def fib(n,cache={}):
>  if n in cache: return cache[n]
>  ret=n if n<2 else fib(n-1)+fib(n-2) # This bit actually calculates fib(n)
>  cache[n]=ret
>  return ret
>
> Of course, this is a poor algorithm for calculating Fibonacci numbers,
> but it does demonstrate the cache. It's recursive, meaning that if it
> has fib(50) in its cache and it is asked for fib(60), it will find and
> make use of the cached element.
>
> (Note the sneaky way of storing a cache dictionary. A function's
> default arguments are evaluated once, so this will use the same
> dictionary for every call.)

If you're using Python 3.2, the functools.lru_cache decorator will do
the caching for you, and without modifying the function arguments.  By
default it stores only the 100 most recent results, but you can make
the storage unbounded by passing in the argument maxsize=None.  Then
the Fibonacci example becomes:

@functools.lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-2) + fib(n-1)



More information about the Python-list mailing list