indexed() generator

Alex Martelli aleax at aleax.it
Wed Jan 23 04:28:06 EST 2002


"Jason Orendorff" <jason at jorendorff.com> wrote in message
news:mailman.1011749612.19737.python-list at python.org...
> Here's a builtin candidate for discussion.
> A common Python idiom goes like this:
>
>   for i in range(len(seq)):
>       obj = seq[i]
>       ...
>       ...
>
> People have complained that this is clunky.

Indeed.

> But with this:
>
>   from __future__ import generators
>
>   def indexed(src):
>       i = 0
>       for obj in src:
>           yield i, obj
>           i += 1
>
> You can write this instead:
>
>   for i, obj in indexed(seq):
>       ...
>       ...
>
> So is this good, bad, or indifferent?  (Or has it
> been discussed before and I missed it?)

There are good 2.1-compatible implementations of
function indexed, too, of course (if you can
spare the memory).  My favourite:

import sys
_xindices = xrange(sys.maxint)
def indexed(seq):
    return zip(_xindices, seq)

However, generators may be interesting here for
performance reasons, I think.  A q&d test:

from __future__ import generators

import time, sys, random
_xindices = xrange(sys.maxint)

def indexed_ge(seq):
    i = 0
    for item in seq:
        yield i, item
        i += 1

def indexed_xr(seq):
    return zip(_xindices, seq)

def indexed_rg(seq):
    return zip(range(len(seq)), seq)

class indexed_cl:
    def __init__(self, seq):
        self.seq = seq
    def __getitem__(self, index):
        return index, self.seq[index]

indexers = [indexed_ge, indexed_xr, indexed_rg, indexed_cl]

for j in range(5):
    random.shuffle(indexers)
    results = []
    for indexer in indexers:
        name = indexer.__name__[8:]
        seq = range(20000)
        start = time.clock()
        for i, item in indexer(seq): pass
        stend = time.clock()
        print name,
        results.append(("%.2f"%(stend-start),name))
    print
    results.sort()
    for duration, name in results:
        print name,duration
    print

Some timings on this box:

C:\Python22>python -OO idx.py
rg ge cl xr
ge 0.08
xr 0.18
cl 0.21
rg 0.23

ge cl xr rg
ge 0.08
xr 0.18
rg 0.19
cl 0.22

xr ge cl rg
ge 0.08
xr 0.18
cl 0.21
rg 0.22

cl rg xr ge
ge 0.08
xr 0.18
rg 0.20
cl 0.22

ge rg cl xr
ge 0.08
xr 0.19
rg 0.21
cl 0.22



Alex






More information about the Python-list mailing list