首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >chain(*iterable)与chain.from_iterable(iterable)的区别

chain(*iterable)与chain.from_iterable(iterable)的区别
EN

Stack Overflow用户
提问于 2016-09-16 21:44:42
回答 3查看 983关注 0票数 12

我真的被itertools中所有有趣的迭代器迷住了,但我有一个困惑,那就是这两个函数之间的区别以及chain.from_iterable存在的原因。

代码语言:javascript
复制
from itertools import chain

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

chain(*foo(5))

chain.from_iterable(foo(5))

这两个函数之间有什么区别?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-16 21:48:14

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

考虑一下

代码语言:javascript
复制
>>> 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是你最好的选择。

票数 13
EN

Stack Overflow用户

发布于 2016-09-16 21:47:38

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

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

尝试使用foo(1000000),并观察内存使用率不断增加。

票数 8
EN

Stack Overflow用户

发布于 2016-09-16 21:47:53

*对迭代器进行解包,这意味着它会迭代迭代器,以便将其值传递给函数。chain.from_iterable懒洋洋地逐一迭代迭代器。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39533052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档