2021年11月9日 星期二

Python 學習筆記 : 迴圈, 生成式, 與產生器的運算速度比較

這幾天研究了 Python 的產生器與生成式, 我想它們在序列資料處理方面與一般的迴圈效能有何不同? 今天在 "Advanced Python Programming (Packt, 2019)" 這本書上剛好看到一個用來比較三者運算速度的範例程式碼, 稍作修改後測試運算速度, 發現串列生成式 (list comprehension) 速度最快, 而產生器表達式 (generator expression) 與一般的迴圈則較慢 : 

# test.py
import time
import random

def loop():
    res=[]
    for i in range(100000):
        res.append(i * i)
    return sum(res)
def comprehension():
    return sum([i * i for i in range(100000)])
def generator():
    return sum(i * i for i in range(100000))

# test loop
start=time.time()
s=loop()
print(f"elapsed time of loop():{time.time()-start}")
# test comprehension
start=time.time()
s=comprehension()
print(f"elapsed time of comprehension():{time.time()-start}")
# test generator
start=time.time()
s=generator()
print(f"elapsed time of generator():{time.time()-start}")

此程式分別以 for 迴圈, 串列生成式, 以及產生器表達式定義了 loop(0, comprehenion(), 以及 generator() 三個函式用來產生 0~99999 的整數序列並計算其和, 使用 time.time() 求取執行所需時間, 結果如下 :

>>> %Run test.py   
elapsed time of loop():0.011966466903686523
elapsed time of comprehension():0.008975744247436523
elapsed time of generator():0.013962268829345703
>>> %Run test.py   
elapsed time of loop():0.011968374252319336
elapsed time of comprehension():0.01196742057800293
elapsed time of generator():0.01595616340637207
>>> %Run test.py   
elapsed time of loop():0.01296687126159668
elapsed time of comprehension():0.008975744247436523
elapsed time of generator():0.009974241256713867
>>> %Run test.py
elapsed time of loop():0.012967348098754883
elapsed time of comprehension():0.00997304916381836
elapsed time of generator():0.010970830917358398

執行多次發現大部分都由 comprehension() 勝出, 串列生成式不僅寫法簡潔, 效能還好棒棒哩. 

沒有留言 :