On Mon, May 30, 2011 at 10:58 PM, vino19 <vinogra...@gmail.com> wrote:
> I want to make a function that is called only once per one argument. I mean I 
> want to store data of function calling to prevent calling it again if there 
> is no need.
> How to make it? For example I can make a global list that just consist of 
> tuples
> [(arg1, res1), (arg2, res2), ...]. Ok, how to search if an arg135 in that 
> list?
>
> Thanks for answering

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.)

Chris Angelico
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to