簡體   English   中英

在 Python 中使用“yield from”比循環中的 yield 更快?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM