Python是一種非常高級(jí)的編程語(yǔ)言。它的類型是面向?qū)ο蠛湍_本語(yǔ)言。與C或C等編程語(yǔ)言相比,其性能和效率會(huì)有一些不足。當(dāng)然,不要以為Python的效率很高。更糟糕的是,只要有正確的代碼規(guī)范,就可以達(dá)到預(yù)期的性能。
代碼優(yōu)化原則:
1.不要過早優(yōu)化。優(yōu)化的前提是代碼可以正常工作。過早優(yōu)化可能會(huì)忽略對(duì)整體性能指標(biāo)的把握。在獲得整體結(jié)果之前不要顛倒優(yōu)先級(jí)。
2.優(yōu)化是有代價(jià)的。幾乎不可能解決所有的性能問題。通常的選擇是時(shí)間換空間或空間換時(shí)間。
3.不要優(yōu)化那些不相關(guān)的部分。如果對(duì)代碼的每一部分都進(jìn)行優(yōu)化,這些修改會(huì)使代碼難以閱讀和理解。如果你的代碼運(yùn)行緩慢,首先要找到代碼運(yùn)行緩慢的地方,一般在內(nèi)循環(huán),重點(diǎn)優(yōu)化慢的地方。在其他地方,稍微耽誤一點(diǎn)時(shí)間是沒有效果的。
避免全局變量:
很多程序員一開始都會(huì)用Python寫一些簡(jiǎn)單的腳本。寫腳本的時(shí)候,一般都是直接把它們寫成全局變量,比如上面的代碼。但是,由于全局變量和局部變量的實(shí)現(xiàn)方式不同,全局作用域中定義的代碼會(huì)比函數(shù)中定義的代碼運(yùn)行得慢很多。通過將腳本語(yǔ)句放入函數(shù)中,通??梢詭泶蠹s15%-30%的速度提升。
循環(huán)優(yōu)化:使用for循環(huán)代替while循環(huán),或者使用隱式for循環(huán)代替顯式for循環(huán),以減少內(nèi)部for循環(huán)的計(jì)算。
選擇合適的數(shù)據(jù)結(jié)構(gòu):
例如,Python的內(nèi)置數(shù)據(jù)結(jié)構(gòu)類似于C中的數(shù)據(jù)結(jié)構(gòu),它是一個(gè)動(dòng)態(tài)數(shù)組。它會(huì)預(yù)先分配一定數(shù)量的內(nèi)存空間。當(dāng)預(yù)先分配的內(nèi)存空間用完,你繼續(xù)往里面添加元素時(shí),它會(huì)申請(qǐng)更大的內(nèi)存空間,然后把原來的元素全部復(fù)制下來,然后銷毀之前的內(nèi)存空間,再插入新的元素。
刪除元素時(shí)的操作類似,當(dāng)使用的內(nèi)存空間小于預(yù)分配內(nèi)存空間的一半時(shí),會(huì)再申請(qǐng)一個(gè)小內(nèi)存,做一個(gè)元素拷貝,之后會(huì)破壞原來的大內(nèi)存空間。因此,如果添加和刪除操作頻繁,并且新增和刪除的元素?cái)?shù)量較多,則列表效率不高,這時(shí)候就應(yīng)該考慮使用了。它是一個(gè)雙端隊(duì)列,同時(shí)具有棧和隊(duì)列的特性,可以在兩端進(jìn)行O(1)復(fù)雜度的插入和刪除操作。