On Sat, May 2, 2020 at 2:58 PM Alex Hall <[email protected]> wrote:

> On Sat, May 2, 2020 at 1:19 PM Steven D'Aprano <[email protected]>
> wrote:
>
>> Rolling your own on top of
>>
> zip_longest is easy. It's half a dozen lines. It could be a recipe in
>> itertools, or a function.
>
>
>> It has taken years for it to be added to more-itertools, suggesting that
>> the real world need for this is small.
>>
>> "Not every two line function needs to be a builtin" -- this is six
>> lines, not two, which is in the proposal's favour, but the principle
>> still applies. Before this becomes a builtin, there are a number of
>> hurdles to pass:
>>
>> - Is there a need for it? Granted.
>> - Is it complicated to get right? No.
>
> - Is performance critical enough that it has to be written in C?
>>   Probably not.
>>
>
> No, probably not
>

I take it back, performance is a problem worth considering. Here is the
more-itertools implementation:

https://github.com/more-itertools/more-itertools/blob/master/more_itertools/more.py#L1420

```
def zip_equal(*iterables):
    """``zip`` the input *iterables* together, but throw an
    ``UnequalIterablesError`` if any of the *iterables* terminate before
    the others.
    """
    for combo in zip_longest(*iterables, fillvalue=_marker):
        for val in combo:
            if val is _marker:
                raise UnequalIterablesError(
                    "Iterables have different lengths."
                )
        yield combo
```

I didn't think carefully about this implementation and thought that there
was only a performance cost in the error case. That's obviously not true -
there's an `if` statement executed in Python for every item in every
iterable. The overhead is O(len(iterables) * len(iterables[0])). Given that
zip is used a lot and most uses of zip should probably be strict, this is a
significant problem. Therefore:

- Rolling your own on top of zip_longest in six lines is not a solution.
- Using more-itertools is not a solution.
- It's complicated to get right.
- Performance is critical enough to do it in C.

>
_______________________________________________
Python-ideas mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/[email protected]/message/WD4ELGMDEHYIG25L3UAIGCTKKBCI564P/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to