天天看點

提升 Python 程式性能的7個習慣

掌握一些技巧,可盡量提高Python程式性能,也可以避免不必要的資源浪費。

1、使用局部變量

盡量使用局部變量代替全局變量:便于維護,提高性能并節省記憶體。

使用局部變量替換子產品名字空間中的變量,例如 ls = os.linesep。一方面可以提高程式性能,局部變量查找速度更快;另一方面可用簡短辨別符替代冗長的子產品變量,提高可讀性。

2、減少函數調用次數

對象類型判斷時,采用isinstance()最優,采用對象類型身份(id())次之,采用對象值(type())比較最次。

#判斷變量num是否為整數類型
type(num) == type(0) #調用三次函數
type(num) is type(0) #身份比較
isinstance(num,(int)) #調用一次函數      

不要在重複操作的内容作為參數放到循環條件中,避免重複運算。

#每次循環都需要重新執行len(a)
while i < len(a):
    statement

#len(a)僅執行一次
m = len(a)
while i < m:      

如需使用子產品X中的某個函數或對象Y,應直接使用from X import Y,而不是import X; X.Y。這樣在使用Y時,可以減少一次查詢(解釋器不必首先查找到X子產品,然後在X子產品的字典中查找Y)。

3、采用映射替代條件查找

映射(比如dict等)的搜尋速度遠快于條件語句(如if等)。Python中也沒有select-case語句。

#if查找
if a == 1:
    b = 10
elif a == 2:
    b = 20
...

#dict查找,性能更優
d = {1:10,2:20,...}
b = d[a]      

4、直接疊代序列元素

對序列(str、list、tuple等),直接疊代序列元素,比疊代元素的索引速度要更快。

a = [1,2,3]

#疊代元素
for item in a:
    print(item)

#疊代索引
for i in range(len(a)):
   print(a[i])      

5、采用生成器表達式替代清單解析

清單解析(list comprehension),會産生整個清單,對大量資料的疊代會産生負面效應。

而生成器表達式則不會,其不會真正建立清單,而是傳回一個生成器,在需要時産生一個值(延遲計算),對記憶體更加友好。

#計算檔案f的非空字元個數
#生成器表達式
l = sum([len(word) for line in f for word in line.split()])

#清單解析
l = sum(len(word) for line in f for word in line.split())      

6、先編譯後調用

使用eval()、exec()函數執行代碼時,最好調用代碼對象(提前通過compile()函數編譯成位元組碼),而不是直接調用str,可以避免多次執行重複編譯過程,提高程式性能。

正規表達式模式比對也類似,也最好先将正規表達式模式編譯成regex對象(通過re.complie()函數),然後再執行比較和比對。

7、子產品程式設計習慣