新聞中心
這篇文章將為大家詳細講解有關(guān)Python性能優(yōu)化的方法路徑怎樣的,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
目前成都創(chuàng)新互聯(lián)公司已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管維護、企業(yè)網(wǎng)站設(shè)計、西藏網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。前言
Python作為程序語言最被人詬病的一點在于其性能。Python作為動態(tài)語言,性能并不是它的優(yōu)勢,但很多時候?qū)嶋H也不會面臨太多性能問題,所以Python的使用場景很廣。但是,總會有碰到性能問題的一天,這種情況下首要的就是要在Python技術(shù)框架內(nèi)來進行性能優(yōu)化了。
決定是否優(yōu)化
性能優(yōu)化是手段,是為了解決其它一些問題。是否將性能優(yōu)化作為正式開發(fā)任務(wù),首要的就是達成共識。開發(fā)期的項目自然好說,上線后的項目就需要估計性能優(yōu)化的工作量、相應(yīng)風(fēng)險以及評估大致的影響范圍。讓產(chǎn)品、開發(fā)、測試都意識到這項任務(wù)的必要性,而后才合適正式開始實施。
性能分析
性能優(yōu)化必要步驟是分析瓶頸,首先得找到究竟慢在哪了,讓后再對癥下藥去進行修改。Python性能分析,直接使用自帶的cProfile
進行處理就可以。用法也很簡單,閱讀官方文檔中
The Python Profilers
一節(jié)就足夠了。
cProfile
結(jié)果的可視化工具有不少,不過配合編碼一起來的話,直接使用PyCharm打開最為方便??梢钥焖偬D(zhuǎn)每一個耗時函數(shù)對應(yīng)的代碼。
關(guān)注那些調(diào)用次數(shù)多的以及單次性能差的,那些大概率就是需要被優(yōu)化的邏輯。
看個人簡介
優(yōu)化檢查
在定位問題后就可以進行修改了。控制每次優(yōu)化改動的范圍,一次改動一處,然后再次Profile對比。優(yōu)化的每一次改進都需要數(shù)據(jù)的支撐,這樣能保證行進在正確的方向上,同時時間上也能有所掌控。
一些代碼的優(yōu)化并不一定好實施,因此這種漸進性的優(yōu)化方式,便于降低項目整體開發(fā)風(fēng)險,能夠保證隨時有可用的版本,且是經(jīng)過了一定優(yōu)化的版本。
持續(xù)監(jiān)控
在進行了性能優(yōu)化之后,就需要注意對性能指標(biāo)進行監(jiān)控了。這樣能夠及時的了解性能全貌,一旦再次需要進行優(yōu)化,也能及早得知決策。
Python代碼優(yōu)化的常見方向
減少不必要的函數(shù)調(diào)用
很多時候沒有必要去優(yōu)化一個函數(shù)實現(xiàn)本身,優(yōu)先考慮是否能夠降低這個函數(shù)的調(diào)用次數(shù),或是直接刪除這個函數(shù)。
這是一種很常見的情況,一些功能層面已經(jīng)不再需要的遺留代碼占據(jù)了很多性能。如果一份代碼多人經(jīng)手,需求多變,反復(fù)迭代,那么這種代碼是很有可能存在的。
搞清楚,然后刪掉它們。
讓運行時的動態(tài)計算靜態(tài)化
部分運行邏輯可以先離線生成得到靜態(tài)結(jié)果,運行時直接加載靜態(tài)結(jié)果就可以了,這部分性能也是應(yīng)該要回收的。
適當(dāng)應(yīng)用緩存
那些不能直接靜態(tài)化的計算可能也可以緩存化。資源的創(chuàng)建銷毀也可以根據(jù)情況判定是否應(yīng)用緩存或?qū)ο蟪刭Y源池一類實現(xiàn)方式,避免重復(fù)運算。
需要注意的是避免因為緩存帶來的內(nèi)存泄漏。
減少gc
Python通過引用計數(shù)與gc進行對象內(nèi)存管理。對于引用計數(shù)無法處理的情況,Python會喚起gc進行處理,gc對性能有一定影響。因此代碼實現(xiàn)的時候最好gc友好,減少代碼中的引用環(huán)。
另外也可以通過設(shè)置gc參數(shù)來控制gc觸發(fā)的幾率,減少在高頻計算時的gc觸發(fā),在空閑時刻手動觸發(fā)gc。
修改明顯錯誤的代碼實現(xiàn)
很多性能問題都是那些非關(guān)鍵邏輯導(dǎo)致的,這些邏輯往往一眼看去就欠缺性能上的考慮,比如,
不斷通過for循環(huán)去進行查找
錯誤的選擇了容器,導(dǎo)致不斷的遍歷查找
在property實現(xiàn)中含有復(fù)雜的耗時邏輯,讓調(diào)用方忽視這一點
在循環(huán)中添加了很多可以移到循環(huán)之外只運行一次的函數(shù)調(diào)用
可以實現(xiàn)成事件觸發(fā)的邏輯變成了輪詢
函數(shù)中存在大量重復(fù)調(diào)用
這類代碼本就不應(yīng)該存在,找出來改掉,并盡力保證未來此類代碼不再進入代碼庫。
高頻調(diào)用中改進一些基礎(chǔ)用法
比如 這里 列出的一些常見用法的性能比較,在高頻調(diào)用的時候就可以看出性能差異,選擇更有效率的實現(xiàn)方式。
優(yōu)化算法
部分邏輯可能可以從是實現(xiàn)方法層面進行優(yōu)化,優(yōu)化算法復(fù)雜度本身。
將部分邏輯改為原生代碼實現(xiàn)
通過C/C++來替換掉部分邏輯也是Python優(yōu)化的常見手段。有幾種選擇,
裸寫C/C++擴展
使用Boost.Python實現(xiàn)C++擴展
使用Cython
使用PyPy
裸寫C/C++需要處理繁瑣的對象轉(zhuǎn)化以及引用處理,一般會選擇使用Boost.Python。使用起來方便很多。
采用Cython可以不去寫C++代碼,但是要寫Cython腳本。根據(jù)情況,有選擇使用。
PyPy相當(dāng)于替換了運行時,在運行時不受掌控的情況下是不能采用的。服務(wù)端的話,可以考慮部分使用,通過進程隔離的方式解決一些依賴上的問題。
需要注意保留必要的Python實現(xiàn),以便在遇到問題時可以快速切換回去。
關(guān)于Python性能優(yōu)化的方法路徑怎樣的就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
本文名稱:Python性能優(yōu)化的方法路徑怎樣的-創(chuàng)新互聯(lián)
文章出自:http://www.dlmjj.cn/article/cssihj.html