[英]In Python is faster using "yield from" than yield in a loop?
我在上面給出的這個例子中嘗試了多個范圍:
import time
def reader():
for a in range(100000000):
yield a
def reader_wrapper(gen):
for i in gen:
yield i
def reader_wrapper_enhanced(gen):
yield from gen
wrap = reader_wrapper_enhanced(reader())
start = time.perf_counter()
for i in wrap:
...
print("LAST: %s " % (time.perf_counter() - start))
wrap = reader_wrapper(reader())
start = time.perf_counter()
for i in wrap:
...
print("LAST: %s " % (time.perf_counter() - start))
我的主要問題是yield from實際上比使用循環的正常yield更快。
范圍的結果:
注意:第一個結果是產量,第二個是產量。
范圍 | 產量來自 | 產量+循環 |
---|---|---|
100 | 1.4644000000001156e-05 | 1.3087000000000168e-05 |
100000 | 0.010678924 | 0.012484127000000005 |
100000000 | 7.763497913 | 8.586706118000002 |
10000000000 | 794.1722820499999 | 807.1722820400000 |
如果它更快,我們不應該總是在這種情況下使用它嗎?
是的,當輸入足夠長時它會更快(雖然不是很多,正如你所見),是的,你也可以讓 Python 默認完成從委托迭代器產生的工作。
有一次你不想這樣做是當你委派給一個生成器時,你不想從調用者那里接收用.send
或.throw
發送的值; 當使用普通的yield
時,您的生成器會接收它們,當使用yield from
時,委托生成器會接收它們(通常后者是您想要的,這是yield from
首先存在的主要原因)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.