When is it better to use zip instead of izip?

后端 未结 4 456
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-28 22:22

When is it better to use zip instead of itertools.izip?

相关标签:
4条回答
  • 2020-11-28 22:44

    When you know you'll want the full list of items constructed (for instance, for passing to a function that would modify that list in-place). Or when you want to force the arguments you're passing to zip() to be completely evaluated at that specific point.

    0 讨论(0)
  • 2020-11-28 22:54

    In 2.x, when you need a list instead of an iterator.

    0 讨论(0)
  • 2020-11-28 23:05

    zip computes all the list at once, izip computes the elements only when requested.

    One important difference is that 'zip' returns an actual list, 'izip' returns an 'izip object', which is not a list and does not support list-specific features (such as indexing):

    >>> l1 = [1, 2, 3, 4, 5, 6]
    >>> l2 = [2, 3, 4, 5, 6, 7]
    >>> z = zip(l1, l2)
    >>> iz = izip(l1, l2)
    >>> isinstance(zip(l1, l2), list)
    True
    >>> isinstance(izip(l1, l2), list)
    False
    >>> z[::2] #Get odd places
    [(1, 2), (3, 4), (5, 6)]
    >>> iz[::2] #Same with izip
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'itertools.izip' object is unsubscriptable
    

    So, if you need a list (an not a list-like object), just use 'zip'.

    Apart from this, 'izip' can be useful for saving memory or cycles.

    E.g. the following code may exit after few cycles, so there is no need to compute all items of combined list:

    lst_a = ... #list with very large number of items
    lst_b = ... #list with very large number of items
    #At each cycle, the next couple is provided
    for a, b in izip(lst_a, lst_b):
        if a == b:
            break
    print a
    

    using zip would have computed all (a, b) couples before entering the cycle.

    Moreover, if lst_a and lst_b are very large (e.g. millions of records), zip(a, b) will build a third list with double space.

    But if you have small lists, maybe zip is faster.

    0 讨论(0)
  • 2020-11-28 23:06

    The itertools library provides "iterators" for common Python functions. From the itertools docs, "Like zip() except that it returns an iterator instead of a list." The I in izip() means "iterator".

    Python iterators are a "lazy loaded" sequence that saves memory over regular in-memory list. So, you would use itertools.izip(a, b) when the two inputs a, b are too big to keep in memory at one time.

    Look up the Python concepts related to efficient sequential processing:

    "generators" & "yield"
    "iterators"
    "lazy loading"
    
    0 讨论(0)
提交回复
热议问题