“返回迭代器"和“迭代器的收益"之间的区别 [英] Difference between `return iterator` and `yield from iterator`
问题描述
我正在尝试实现自己的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屋!