簡體   English   中英

為什么發電機更快?

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

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