Python在性能方面并不擅長(zhǎng),但通過一些提示著隆,您可以嘗試提高程序性能并避免不必要的資源浪費(fèi)扰楼。
1.使用局部變量
嘗試使用局部變量而不是全局變量使其易于維護(hù)呀癣,有助于提高性能并節(jié)省內(nèi)存。
使用局部變量替換模塊命名空間中的變量弦赖,例如ls = os.linesep
项栏。一方面,它可以提高程序性能蹬竖,因?yàn)榫植孔兞康乃阉魉俣雀? 另一方面沼沈,冗長(zhǎng)的模塊變量可以用短標(biāo)識(shí)符替換,以提高可讀性币厕。
2.減少函數(shù)調(diào)用的次數(shù)
在確定對(duì)象類型時(shí)列另,最佳使用isinstance()
,次優(yōu)使用id()
劈榨,最差type()
用于比較访递。
#Determine whether the variable num is an integer type
type(num) == type(0) #call the function three times
type(num) is type(0) #identity comparison
isinstance(num,(int)) #call the function once
不要將重復(fù)操作作為參數(shù)放在循環(huán)中,以避免重復(fù)計(jì)算同辣。
#Each loop needs to re-execute len(a)
while i < len(a):
statement
#Only execute len(a) once
m = len(a)
while i < m:
statement
要Y
在模塊中使用函數(shù)或?qū)ο?code>X拷姿,您應(yīng)該from X import Y
直接使用 而不是 import X; X.Y
。因此旱函,在使用時(shí)Y
响巢,您可以減少一次查詢(解釋器不必先找到X
模塊,然后Y
在X
模塊的字典中查找)棒妨。
3.使用映射替換條件搜索
映射的搜索速度(例如dict
等)比條件語(yǔ)句(例如if
等)快得多踪古。select-case
Python中沒有聲明。
#if? reach
if a == 1:
b = 10
elif a == 2:
b = 20
...
#dict reach券腔,better performance
d = {1:10,2:20,...}
b = d[a]
4.直接迭代序列元素
對(duì)于序列(str
伏穆,list
,tuple
等)纷纫,迭代序列元件直接比迭代元件索引更快枕扫。
a = [1,2,3]
#Iterate elements
for item in a:
print(item)
#Iterate indexes
for i in range(len(a)):
print(a[i])
5.用生成器表達(dá)式替換列表理解
列表理解將產(chǎn)生整個(gè)列表,對(duì)大量數(shù)據(jù)的迭代產(chǎn)生負(fù)面影響辱魁。
但是生成器表達(dá)式?jīng)]有烟瞧。它實(shí)際上并不創(chuàng)建一個(gè)列表,而是返回一個(gè)生成器染簇,它在需要時(shí)產(chǎn)生一個(gè)值(延遲)参滴,這對(duì)內(nèi)存更友好。
#Calculate the number of non-null characters in file f
#List analysis
l = sum([len(word) for line in f for word in line.split()])
#generator expression
l = sum(len(word) for line in f for word in line.split())
6.首先編譯然后調(diào)用
當(dāng)使用該函數(shù) eval()
并 exec()
執(zhí)行代碼時(shí)锻弓,最好調(diào)用代碼對(duì)象(通過compile()
函數(shù)預(yù)先編譯成字節(jié)碼 )而不是str
直接調(diào)用 砾赔,這樣可以避免多次重復(fù)編譯過程并提高程序的性能。
正則表達(dá)式模式匹配是類似的。re.complie()
在執(zhí)行比較和匹配之前过蹂,最好將正則表達(dá)式模式編譯為正則表達(dá)式對(duì)象(通過 函數(shù))十绑。
7.模塊編程的習(xí)慣
模塊中最高級(jí)別的Python語(yǔ)句(無(wú)縮進(jìn)代碼)將在導(dǎo)入模塊時(shí)執(zhí)行(是否真的需要執(zhí)行)。因此酷勺,您應(yīng)該嘗試將模塊的所有功能代碼放入函數(shù)中(與主程序相關(guān)的功能代碼也可以放入 main()
函數(shù)中本橙,主程序本身調(diào)用該 main()
函數(shù))。
測(cè)試代碼可以main()
在模塊的功能中編寫 脆诉。__name__
將在主程序中檢測(cè)到該值 甚亭。如果是' __main__'
(表示模塊是直接執(zhí)行的),則main()
調(diào)用該 函數(shù)進(jìn)行測(cè)試; 如果它是模塊的名稱(表示模塊被調(diào)用)击胜,則不會(huì)執(zhí)行測(cè)試