Best way to extract an item from a set of len 1

Christophe chris.cavalaria at free.fr
Thu Jan 26 12:13:54 EST 2006


Alex Martelli a écrit :
> Fredrik Lundh <fredrik at pythonware.com> wrote:
>    ...
> 
>>the obvious solution is
>>
>>    item = list(s)[0]
>>
>>but that seems to be nearly twice as slow as [x for x in s][0]
>>under 2.4.  hmm. 
> 
> 
> Funny, and true on my laptop too:
> 
> helen:~ alex$ python -mtimeit -s's=set([23])' 'x=list(s)[0]'
> 100000 loops, best of 3: 2.55 usec per loop

That's probably because of the name lookup needed for "list"

> helen:~ alex$ python -mtimeit -s's=set([23])' 'x=[x for x in s][0]'
> 100000 loops, best of 3: 1.48 usec per loop
> helen:~ alex$ python -mtimeit -s's=set([23])' '[x for x in s]'
> 1000000 loops, best of 3: 1.36 usec per loop
> 
> Exploiting the design defect whereby a LC leaves variables bound can
> shave another few percents off it, as shown.
> 
> 
>>here's a faster variant:
>>
>>    item = iter(s).next()
> 
> 
> Not all that fast here:
> 
> helen:~ alex$ python -mtimeit -s's=set([23])' 'x=iter(s).next()'
> 100000 loops, best of 3: 1.71 usec per loop

That's probably because of the 2 name lookups needed :) "iter" and "next"

>>but at least on my machine, your two-step solution
>>
>>    item = s.pop(); s.add(item)
>>seems to be even faster.
> 
> 
> Not really, here:
> 
> helen:~ alex$ python -mtimeit -s's=set([23])' 'x=s.pop();s.add(x)'
> 100000 loops, best of 3: 1.49 usec per loop
> 
> No joy from several variations on transform-and-pop:
> 
> helen:~ alex$ python -mtimeit -s's=set([23])' 'x=set(s).pop()'    
> 100000 loops, best of 3: 2.21 usec per loop
> helen:~ alex$ python -mtimeit -s's=set([23])' 'x=list(s).pop()'
> 100000 loops, best of 3: 3.2 usec per loop
> helen:~ alex$ python -mtimeit -s's=set([23])' 'x=tuple(s)[0]'
> 100000 loops, best of 3: 1.79 usec per loop
> 
> 
> Fastest I've found is unpacking-assignment:
> 
> helen:~ alex$ python -mtimeit -s's=set([23])' 'x,=s'          
> 1000000 loops, best of 3: 0.664 usec per loop
> 
> 
> Alex



More information about the Python-list mailing list