您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python性能優化的方法路徑怎樣的,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
Python作為程序語言最被人詬病的一點在于其性能。Python作為動態語言,性能并不是它的優勢,但很多時候實際也不會面臨太多性能問題,所以Python的使用場景很廣。但是,總會有碰到性能問題的一天,這種情況下首要的就是要在Python技術框架內來進行性能優化了。
性能優化是手段,是為了解決其它一些問題。是否將性能優化作為正式開發任務,首要的就是達成共識。開發期的項目自然好說,上線后的項目就需要估計性能優化的工作量、相應風險以及評估大致的影響范圍。讓產品、開發、測試都意識到這項任務的必要性,而后才合適正式開始實施。
性能優化必要步驟是分析瓶頸,首先得找到究竟慢在哪了,讓后再對癥下藥去進行修改。Python性能分析,直接使用自帶的cProfile
進行處理就可以。用法也很簡單,閱讀官方文檔中
The Python Profilers
一節就足夠了。
cProfile
結果的可視化工具有不少,不過配合編碼一起來的話,直接使用PyCharm打開最為方便。可以快速跳轉每一個耗時函數對應的代碼。
關注那些調用次數多的以及單次性能差的,那些大概率就是需要被優化的邏輯。
看個人簡介
在定位問題后就可以進行修改了。控制每次優化改動的范圍,一次改動一處,然后再次Profile對比。優化的每一次改進都需要數據的支撐,這樣能保證行進在正確的方向上,同時時間上也能有所掌控。
一些代碼的優化并不一定好實施,因此這種漸進性的優化方式,便于降低項目整體開發風險,能夠保證隨時有可用的版本,且是經過了一定優化的版本。
在進行了性能優化之后,就需要注意對性能指標進行監控了。這樣能夠及時的了解性能全貌,一旦再次需要進行優化,也能及早得知決策。
很多時候沒有必要去優化一個函數實現本身,優先考慮是否能夠降低這個函數的調用次數,或是直接刪除這個函數。
這是一種很常見的情況,一些功能層面已經不再需要的遺留代碼占據了很多性能。如果一份代碼多人經手,需求多變,反復迭代,那么這種代碼是很有可能存在的。
搞清楚,然后刪掉它們。
部分運行邏輯可以先離線生成得到靜態結果,運行時直接加載靜態結果就可以了,這部分性能也是應該要回收的。
那些不能直接靜態化的計算可能也可以緩存化。資源的創建銷毀也可以根據情況判定是否應用緩存或對象池資源池一類實現方式,避免重復運算。
需要注意的是避免因為緩存帶來的內存泄漏。
Python通過引用計數與gc進行對象內存管理。對于引用計數無法處理的情況,Python會喚起gc進行處理,gc對性能有一定影響。因此代碼實現的時候最好gc友好,減少代碼中的引用環。
另外也可以通過設置gc參數來控制gc觸發的幾率,減少在高頻計算時的gc觸發,在空閑時刻手動觸發gc。
很多性能問題都是那些非關鍵邏輯導致的,這些邏輯往往一眼看去就欠缺性能上的考慮,比如,
不斷通過for循環去進行查找
錯誤的選擇了容器,導致不斷的遍歷查找
在property實現中含有復雜的耗時邏輯,讓調用方忽視這一點
在循環中添加了很多可以移到循環之外只運行一次的函數調用
可以實現成事件觸發的邏輯變成了輪詢
函數中存在大量重復調用
這類代碼本就不應該存在,找出來改掉,并盡力保證未來此類代碼不再進入代碼庫。
比如 這里 列出的一些常見用法的性能比較,在高頻調用的時候就可以看出性能差異,選擇更有效率的實現方式。
部分邏輯可能可以從是實現方法層面進行優化,優化算法復雜度本身。
通過C/C++來替換掉部分邏輯也是Python優化的常見手段。有幾種選擇,
裸寫C/C++擴展
使用Boost.Python實現C++擴展
使用Cython
使用PyPy
裸寫C/C++需要處理繁瑣的對象轉化以及引用處理,一般會選擇使用Boost.Python。使用起來方便很多。
采用Cython可以不去寫C++代碼,但是要寫Cython腳本。根據情況,有選擇使用。
PyPy相當于替換了運行時,在運行時不受掌控的情況下是不能采用的。服務端的話,可以考慮部分使用,通過進程隔離的方式解決一些依賴上的問題。
需要注意保留必要的Python實現,以便在遇到問題時可以快速切換回去。
關于Python性能優化的方法路徑怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。