[英]Python 3: Loops, list comprehension and map slower compared to Python 2?
[英]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.