簡體   English   中英

生成器比python中的while循環快嗎?

[英]Is generator faster than while loop in python?

問題很簡單,我有以下代碼在python2中做同樣的事情:

for _ in range(n): # or xrange(),they have similar performance according to my test
    pass

i = 0
while i < n:
    i+=1
    pass

for循環比while循環快,當n = 1000000時,每個循環大約花費0.105544和0.2389421

  1. 在表面上看起來好像while循環正在執行增量邊界檢查 ,但是據我所知,生成器或迭代器必須執行相同數量的艱苦工作,因此,如果完成的工作相同,為什么會更快比另一個?

來自python生成器Wiki

def generator(n):
    i = 0
    while i < n:
        yield i
        i += 1
  1. 對於迭代器,通常會有一個成員函數 next,並且每次調用該函數時,它將返回“迭代器中的下一個項目” ,這對我來說意味着很多函數調用,因此在堆棧上會產生巨大的開銷(更多的匯編代碼可以執行推入和彈出堆棧操作),並根據我對協程(生成器)的了解,它試圖通過創建一個新的獨立堆棧來規避此問題(就像線程一樣,它管理自己的程序計數器),盡管它不會如果再處理大量的函數調用,它將承擔與線程相同的問題,即上下文切換的開銷。
    當while循環不面對我上面提到的任何開銷時,如何使其變慢

我希望您看到的性能差異與在Python中定義代碼的哪些部分以及在解釋器內部定義的部分有關(對於Cpython,在C語言中)。 例如,在for循環情況下,對next的調用將在C中處理,對於range或其他內置可迭代的函數,該功能的實現也將在C中進行,因此它可能非常快。 另一方面, while循環中的邊界檢查是一個Python表達式,需要在循環的每個遍歷中對其求值。 Python代碼幾乎總是比C代碼慢,因此,在某些情況下for循環可能比while循環更快,這並不太令人震驚。

但是請注意,這兩種循環可能都比您在其中進行的任何有用工作都要快得多。 幾乎永遠不值得將精力集中在像這樣的不同類型的循環之間的很小的性能差異上,而不是將精力集中在算法復雜性或數據結構效率之類的較大問題上。

唯一的例外是,如果您對代碼進行了大量分析,發現特定循環是特定程序的最大性能瓶頸。 如果是這種情況,請微優化您的心臟。

暫無
暫無

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

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