簡體   English   中英

與列表理解相比,生成器更慢

[英]generator is slower compared to list comprehension

據我所知,當我們只想使用一次值時,我們可能會使用生成器。 使用下面的兩個例子,我的邏輯是第二個應該更快,因為第一個創建一個列表然后循環值...而第二個只處理來自生成器的值。 然而,當我計算時間時,列表理解總是比生成器快。 為什么是這樣?

第一名:

x = []
a = time.perf_counter()
for j in [i**2 for i in range(20000)]:
    x.append(j)
print( time.perf_counter() - a )

第二:

x = []
a = time.perf_counter()
for j in (i**2 for i in range(20000)):
    x.append(j)
print( time.perf_counter() - a )

是的,生成器和genexprs通常(heh)比列表推導慢,但另一方面它們被懶惰地評估,並且你不必為完全預先計算的列表支付內存成本。 我想,速度差異是由於(隱式或顯式) yield拋出值的調用幀開銷引起的。

使用你的代碼,但timeit了第三個版本使用生成函數來衡量它,並且:

import timeit

def f1():
    x = []
    for j in [i**2 for i in range(20000)]:
        x.append(j)
    return x

def f2():
    x = []
    for j in (i**2 for i in range(20000)):
        x.append(j)
    return x


def f3():
    def gen():
        for i in range(20000):
            yield i ** 2
    x = []
    for j in gen():
        x.append(j)
    return x


print(timeit.timeit(f1, number=100))
print(timeit.timeit(f2, number=100))
print(timeit.timeit(f3, number=100))

結果(Python 3.7.0)似乎指向genexprs與生成器函數一樣快,比列表理解慢約4-5%。

f1 = 2.882695159
f2 = 3.0303254170000002
f3 = 3.002670741

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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