chain(* iterable)与chain.from_iterable(iterable)之间的差异

问题描述 投票:12回答:3

[我对itertools中所有有趣的迭代器非常着迷,但是我感到困惑的是这两个函数之间的区别以及chain.from_iterable存在的原因。

from itertools import chain

def foo(n):
    for i in range(n):
        yield [i, i**2]

chain(*foo(5))

chain.from_iterable(foo(5))

这两个功能有什么区别?

python itertools
3个回答
12
投票

前者只能处理不可打包的迭代。后者可以处理无法完全解包的可迭代对象,例如无限生成器。

考虑

>>> from itertools import chain
>>> def inf():
...     i=0
...     while True:
...         i += 1
...         yield (i, i)
... 
>>> x=inf()
>>> y=chain.from_iterable(x)
>>> z=chain(*x)
<hangs forever>

此外,开箱只是一项急切的,前期成本的活动,因此,如果您的迭代具有想要懒惰地评估的效果,from_iterable是您的最佳选择。


8
投票

[chain(*foo(5))解压缩整个生成器,将其打包为一个元组,然后对其进行处理。

[chain.from_iterable(foo(5))向从foo(5)值创建的生成器查询值。

尝试foo(1000000)并观察内存使用率上升。


4
投票

*解压缩迭代器,这意味着对其进行迭代以将其值传递给函数。 chain.from_iterable懒惰地迭代迭代器。

© www.soinside.com 2019 - 2024. All rights reserved.