[Python-ideas] data structures should have an .any() method

Stefan Behnel stefan_ml at behnel.de
Fri Sep 4 21:36:57 CEST 2009


Guido van Rossum wrote:
> On Fri, Sep 4, 2009 at 2:35 AM, Stefan Behnel wrote:
>> I just had a discussion with a co-worker, and we noticed that there are use
>> cases where you just want the only element in a data structure, or just any
>> of the elements in a data structure because you know that they all contain
>> the same information (with respect to what you are looking for, at least).
>>
>> If you want all items, you can iterate, but if you just want any item or
>> the only item, it's inefficient (and not very explicit code) to create an
>> iterator and take the element out.
> 
> I assure you it's not slow.

Not in absolute numbers, but certainly slower than necessary:

$ python2.6 -m timeit -s 'l=[1]' 'l[0]'
10000000 loops, best of 3: 0.0977 usec per loop

$ python2.6 -m timeit -s 'l=[1]' 'next(iter(l))'
1000000 loops, best of 3: 0.523 usec per loop


> next(iter(x)) is probably as good as it
> gets -- I don't think we need another way to say that in fewer words.

I'm fine with such a decision, given that it's trivial to wrap this into
your own function. That doesn't make it much faster:


$ python2.6 -m timeit -s 'l=[1]' -s 'def getany(l):'
                                 -s '  return l[0]'
                      'getany(l)'
1000000 loops, best of 3: 0.34 usec per loop

$ python2.6 -m timeit -s 'l=[1]' -s 'def getany(l):' \
                                 -s '  for x in l:' \
                                 -s '    return x' \
                      'getany(l)'
1000000 loops, best of 3: 0.454 usec per loop

$ python2.6 -m timeit -s 'l=[1]' -s 'def getany(l):' \
                                 -s '  return next(iter(l))' \
                      'getany(l)'
1000000 loops, best of 3: 0.743 usec per loop


but, admittedly, that's still not slow in absolute numbers.

Stefan




More information about the Python-ideas mailing list