[英]Why are generators faster?
我知道生成器比迭代器快。 我也了解可以使用for
循環語法實現生成器。 例如:
import time
startT = time.time()
def myGen(n):
for i in range(n):
yield x
def myIter(n):
for i in range(n):
pass
def main():
n=100
startT=time.time()
myIter(n)
print 'myIter took ', time.time() - startT
startT=time.time()
myGen(n)
print 'myGen(n) took ', time.time() - startT
這只是結果的一個示例:
myIter took 0.09234782
myGen(n) took 0.017847266
由於這使用了for
循環語法,所以我不明白它比迭代器快多少。 該生成器使用迭代器,因為“ for”循環是使用迭代器實現的。 如果您為這些時間計時,則生成器將始終保持更快的速度。 為什么當生成器使用迭代器時呢?
謝謝。
在您的代碼中, myIter(n)
實際上可以工作-循環100次。
另一方面, myGen(n)
只是構建生成器-就是這樣。 它不會計數到100。您要做的只是計時構建對象所需的時間,而您計時的方式卻不可靠。 如果我們使用timeit
(這里使用IPython使事情更簡單):
>>> %timeit myIter(100)
1000000 loops, best of 3: 1 µs per loop
>>> %timeit myGen(100)
10000000 loops, best of 3: 163 ns per loop
>>> %timeit myGen(10**1000)
10000000 loops, best of 3: 163 ns per loop
而且我們看到myGen(n)
時間與n
無關,因為它沒有做任何事情。 實際上,我們可以看到您的代碼從未以其他方式執行:
>>> list(myGen(100))
Traceback (most recent call last):
File "<ipython-input-11-dd43d937402a>", line 1, in <module>
list(myGen(100))
File "<ipython-input-1-ba968e48e9fd>", line 3, in myGen
yield x
NameError: name 'x' is not defined
如果我們修正了這種錯字,然后嘗試使用一種快速的方式來消耗生成器,我們將得到類似
>>> %timeit myIter(100)
1000000 loops, best of 3: 1 µs per loop
>>> %timeit consume(myGen(100), 100)
100000 loops, best of 3: 3.44 µs per loop
通常情況下,生成器版本較慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.