我的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
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP