我的Python程式太慢了。如何加快它的速度?


如果你的Python程式太慢,你可以遵循以下提示和技巧:

抽象

避免過度抽象,特別是以微小函式或方法的形式。抽象往往會建立間接層,並迫使直譯器做更多工作。如果間接層的數量超過完成的有用工作的數量,你的程式將會變慢。

避免迴圈開銷

如果你的迴圈體很簡單,那麼for迴圈本身的直譯器開銷可能會佔很大一部分開銷。這時,map函式會更好地工作。唯一的限制是map的迴圈體必須是一個函式呼叫。

示例

讓我們來看一個迴圈的例子

newlist = [] for word in oldlist: newlist.append(word.upper())

我們可以使用map來避免上述迴圈的開銷:

newlist = map(str.upper, oldlist)

使用列表推導式

使用列表推導式的開銷比for迴圈要小。讓我們看看使用列表推導式實現的相同示例:

newlist = [s.upper() for s in oldlist]

生成器表示式

生成器表示式在Python 2.4中引入。由於它避免了同時生成整個列表的開銷,因此它被認為是迴圈的最佳替代方案。相反,它們返回一個可以逐個迭代的生成器物件:

iterator = (s.upper() for s in oldlist)

區域性變數

Python訪問區域性變數的效率遠高於全域性變數。我們可以使用區域性變數本身來實現上述示例:

def func(): upper = str.upper newlist = [] append = newlist.append for word in oldlist: append(upper(word)) return newlist

匯入語句開銷

匯入語句可以很容易地執行。將它們放在函式內部通常很有用,以限制它們的可見性,和/或減少初始啟動時間。在某些情況下,重複執行匯入語句會嚴重影響效能。

字串連線

當使用join連線許多字串時,這是一個更好更快的方法。但是,當字串不多時,使用+運算子進行連線效率更高。它的執行時間更短。讓我們用兩個例子來看:

使用+運算子連線多個字串

示例

我們現在將連線許多字串,並使用time模組檢查執行時間:

from time import time myStr ='' a='gjhbxjshbxlasijxkashxvxkahsgxvashxvasxhbasxjhbsxjsabxkjasjbxajshxbsajhxbsajxhbasjxhbsaxjash' l=[] # Using the + operator t=time() for i in range(1000): myStr = myStr+a+repr(i) print(time()-t)

輸出

0.003464221954345703

使用join連線多個字串

示例

我們現在將使用join連線許多字串並檢查執行時間。當我們有很多字串時,join是一個更好更快的方法:

from time import time myStr ='' a='gjhbxjshbxlasijxkashxvxkahsgxvashxvasxhbasxjhbsxjsabxkjasjbxajshxbsajhxbsajxhbasjxhbsaxjash' l=[] # Using the + operator t=time() for i in range(1000): l.append(a + repr(i)) z = ''.join(l) print(time()-t)

輸出

0.000995635986328125

更新於:2022年9月19日

260 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.