我真的被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))这两个函数之间有什么区别?
发布于 2016-09-16 21:48:14
前者只能处理不可打包的迭代体。后者可以处理无法完全解包的可迭代对象,例如无限生成器。
考虑一下
>>> 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是你最好的选择。
发布于 2016-09-16 21:47:38
chain(*foo(5))解压整个生成器,将其打包成一个元组,然后对其进行处理。
chain.from_iterable(foo(5))查询从foo(5)值创建的生成器的值。
尝试使用foo(1000000),并观察内存使用率不断增加。
发布于 2016-09-16 21:47:53
*对迭代器进行解包,这意味着它会迭代迭代器,以便将其值传递给函数。chain.from_iterable懒洋洋地逐一迭代迭代器。
https://stackoverflow.com/questions/39533052
复制相似问题