can list comprehensions replace map?
Andrew Dalke
dalke at dalkescientific.com
Fri Jul 29 11:38:32 EDT 2005
Peter Otten wrote:
> Combining your "clever" and your "elegant" approach to something fast
> (though I'm not entirely confident it's correct):
>
> def fillzip(*seqs):
> def done_iter(done=[len(seqs)]):
> done[0] -= 1
> if not done[0]:
> return
> while 1:
> yield None
> seqs = [chain(seq, done_iter()) for seq in seqs]
> return izip(*seqs)
Ohh, that's pretty neat passing in 'done' via a mutable default argument.
It took me a bit to even realize why it does work. :)
Could make it one line shorter with
from itertools import chain, izip, repeat
def fillzip(*seqs):
def done_iter(done=[len(seqs)]):
done[0] -= 1
if not done[0]:
return []
return repeat(None)
seqs = [chain(seq, done_iter()) for seq in seqs]
return izip(*seqs)
Go too far on that path and the code starts looking likg
from itertools import chain, izip, repeat
forever, table = repeat(None), {0: []}.get
def fillzip(*seqs):
def done_iter(done=[len(seqs)]):
done[0] -= 1
return table(done[0], forever)
return izip(*[chain(seq, done_iter()) for seq in seqs])
Now add the performance tweak....
def done_iter(done=[len(seqs)], forever=forever, table=table)
Okay, I'm over it. :)
Andrew
dalke at dalkescientific.com
More information about the Python-list
mailing list