Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #6655 > unrolled thread

searching in list

Started byvino19 <vinograd19@gmail.com>
First post2011-05-30 05:58 -0700
Last post2011-05-30 10:32 -0600
Articles 4 — 4 participants

Back to article view | Back to comp.lang.python


Contents

  searching in list vino19 <vinograd19@gmail.com> - 2011-05-30 05:58 -0700
    Re: searching in list Dave Angel <davea@ieee.org> - 2011-05-30 09:27 -0400
    Re: searching in list Chris Angelico <rosuav@gmail.com> - 2011-05-30 23:41 +1000
    Re: searching in list Ian Kelly <ian.g.kelly@gmail.com> - 2011-05-30 10:32 -0600

#6655 — searching in list

Fromvino19 <vinograd19@gmail.com>
Date2011-05-30 05:58 -0700
Subjectsearching in list
Message-ID<cec1aa77-86b3-4bff-8286-a84c823750d2@glegroupsg2000goo.googlegroups.com>
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

[toc] | [next] | [standalone]


#6657

FromDave Angel <davea@ieee.org>
Date2011-05-30 09:27 -0400
Message-ID<mailman.2264.1306762089.9059.python-list@python.org>
In reply to#6655
On 01/-10/-28163 02:59 PM, vino19 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
>

Usual answer is to use a dict.  You can convert a list of tuples to a 
dict by    dict(mylist)

Second choice is to keep the list sorted, and use the bisect module. 
But usually a dictionary is better.

DaveA

[toc] | [prev] | [next] | [standalone]


#6660

FromChris Angelico <rosuav@gmail.com>
Date2011-05-30 23:41 +1000
Message-ID<mailman.2266.1306762863.9059.python-list@python.org>
In reply to#6655
On Mon, May 30, 2011 at 10:58 PM, vino19 <vinograd19@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

[toc] | [prev] | [next] | [standalone]


#6666

FromIan Kelly <ian.g.kelly@gmail.com>
Date2011-05-30 10:32 -0600
Message-ID<mailman.2274.1306773179.9059.python-list@python.org>
In reply to#6655
On Mon, May 30, 2011 at 7:41 AM, Chris Angelico <rosuav@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)

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.python


csiph-web