[Python-ideas] Adding a new function "zip_flat" to itertools (Re: Rewriting the "roundrobin" recipe in the itertools documentation)

bunslow bunslow at gmail.com
Mon Nov 20 20:19:38 EST 2017

(Regarding the stackoverflow link, he does have a version that includes the
trivial fix to apply iter() to args, at the bottom of the post.)

I think that the variety of solutions with a variety of merits is
indicative that it would be useful to have a "zip_flat" in the itertools
module, but I guess support for that isn't very strong here. I see that
Terry opened a bug to clean up the current recipe in the docs, which is
better than nothing, but I think it's the absolute bare minimum improvement.

I'm prepared to drop the subject unless there's further discussion in favor
of it.

Thanks again to all for the replies.


On Mon, Nov 20, 2017 at 10:08 AM, Steven D'Aprano <steve at pearwood.info>

> Hi Bill,
> I don't have time to go through your email in detail and respond to
> every point you raise, but I'd like to respond to one point you made.
> On Mon, Nov 20, 2017 at 02:03:13AM -0600, bunslow wrote:
> > I also found this answer:
> >
> > https://stackoverflow.com/questions/243865/how-do-i-
> merge-two-python-iterators/40498526#40498526
> >
> > which proposes a solution that is both more correct and efficient than
> the
> > zip_longest-with-sentinels, and also noticeably more readable than either
> > the original doc recipe or even Terry's cleaned up replacement of it.
> Please don't make claims about correctness and efficiency without
> testing the code first. The second suggestion given there, using deque,
> is *not* correct as provided, as it fails to work with iterables. It
> requires the caller to pass only iterators, unlike the existing
> roundrobin recipe which accepts any iterable.

> Nor is it more efficient, at least on my machine -- in fact the
> opposite, it is the worst performing of the four recipes I've tried:
> - the current recipe from the itertools docs;
> - your re-write, using zip_longest;
> - Terry's version;
> - and the one from stackoverflow.
> I've attached my test code, in case you want to play around with it.
> Apologies in advance for any bugs in the test code (its 2 in the
> morning here and I've had a long day).
> According to my testing, on my computer using Python 3.5, Terry's code
> is by far the fastest in all three separate test cases, but that
> probably shouldn't count since it's buggy (it truncates the results and
> bails out early under some circumstances). Out of the implementations
> that don't truncate, the existing recipe is by far the fastest.
> Terry, if you're reading this, try:
> list(roundrobin('A', 'B', 'CDE'))
> Your version truncates the results to A B C instead of A B C D E as the
> itertools recipe gives.
> But I digress... the point is, if you're going to make claims about the
> correctness and efficiency of code, you really ought to actually check
> the correctness and efficiency first.
> I may or may not get around to responding to some of your other points
> over the next few days.
> --
> Steve
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20171120/46cb3a18/attachment.html>

More information about the Python-ideas mailing list