“返回迭代器"和“迭代器的收益"之间的区别 [英] Difference between `return iterator` and `yield from iterator`

查看:73
本文介绍了“返回迭代器"和“迭代器的收益"之间的区别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试实现自己的itertools.compress版本,问题是我偶然发现了返回类型.我的意思是这两个函数都返回一个迭代器,但是我认为第二个函数不被视为生成器函数,因为里面没有yield语句.所以我的问题是,这两个实现是否等效?

I'm trying to implement my own version of itertools.compress, the problem is that i stumbled upon the return type. I mean both of these functions return an iterator, but i think the second one is not considered a generator function because there is no yield statement inside. So my question is, are these two implementations equivalent ?

def compress (seq, selectors):
    from operator import itemgetter
    fst = itemgetter (0)
    snd = itemgetter (1)
    yield from map (fst, filter (snd, zip (seq, selectors)))

def compress (seq, selectors):
    from operator import itemgetter
    fst = itemgetter (0)
    snd = itemgetter (1)
    return map (fst, filter (snd, zip (seq, selectors)))

推荐答案

虽然它们看起来很相似,即使输出结果,但它们并不等同.

While they may look like very similar, even outputted with results, they are not equivalent.

看看这些基本代码示例,将str映射到range(100)

Look at these basic code examples, mapping str to range(100)

def do_yield_from():
    yield from map(str, range(100))


def do_return():
    return map(str, range(100))

print(do_yield_from())
print(do_return())

>>> <class 'generator'>
>>> <class 'map'>

第一个函数是generator,它从do_yield_from

for r in range(100): yield str(r)

第二个函数返回map的实例,该实例是iterator而不是generator.

The second function returns an instance of map, which is an iterator and not a generator.

由于第一个功能是generator,所以yield from的性能优于do_return

Due to the first function being a generator, yield from has better performance than do_return

import timeit
print(timeit.timeit(do_yield_from))
>>> 0.53931242968009

print(timeit.timeit(do_return))
>>> 1.467075402143485

这篇关于“返回迭代器"和“迭代器的收益"之间的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆