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