all pairs of items in a list without indexing?

Steven Bethard steven.bethard at gmail.com
Wed Sep 29 12:07:51 EDT 2004


Alex Martelli <aleaxit <at> yahoo.com> writes:
> With slicing:
> 
> kallisti:~/cb alex$ python2.4 timeit.py -s'l=range(333)' '[(x,y) for i,x
> in enumerate(l) for y in l[i+1:]]'
> 10 loops, best of 3: 1.43e+05 usec per loop
> kallisti:~/cb alex$ python2.4 timeit.py -s'l=range(333)' '[(x,y) for i,x
> in enumerate(l) for y in l[i+1:]]'
> 10 loops, best of 3: 1.41e+05 usec per loop
> 
> With xrange(len(...:
> 
> kallisti:~/cb alex$ python2.4 timeit.py -s'l=range(333)' '[(l[i],l[j])
> for i in xrange(len(l)) for j in xrange(i+1,len(l))]'
> 10 loops, best of 3: 1.61e+05 usec per loop
> kallisti:~/cb alex$ python2.4 timeit.py -s'l=range(333)' '[(l[i],l[j])
> for i in xrange(len(l)) for j in xrange(i+1,len(l))]'
> 10 loops, best of 3: 1.62e+05 usec per loop

Wow, interesting.  Slicling's still faster in a slightly more fair comparison:

>python timeit.py -s "l=range(333)" "[(x,i) for i,x in enumerate(l) for y in l
[:i+1]]"
10 loops, best of 3: 24.5 msec per loop
>python timeit.py -s "l=range(333)" "[(x,i) for i,x in enumerate(l) for y in l
[:i+1]]"
10 loops, best of 3: 24.4 msec per loop

>python timeit.py -s "l=range(333)" "[(x,l[j]) for i,x in enumerate(l) for j 
in xrange(i+1,len(l))]"
10 loops, best of 3: 28.9 msec per loop
>python timeit.py -s "l=range(333)" "[(x,l[j]) for i,x in enumerate(l) for j 
in xrange(i+1,len(l))]"
10 loops, best of 3: 28.8 msec per loop

So slicing a list and iterating over the slice is faster than iterating over 
the indices and indexing the items...  Is this generally true?  Is it 
something I can depend on across implementations?

STeve




More information about the Python-list mailing list