python 效能優化(2)

2021-06-05 08:52:47 字數 2710 閱讀 3773

第二部分

有益的提醒,靜態編譯的**仍然重要. 僅例舉幾例, chrome,firefox,mysql,ms office 和 photoshop都是高度優化的軟體,我們每天都在使用. python作為解析語言,很明顯不適合. 不能單靠python來滿足那些效能是首要指示的領域.  這就是為什麼python支援讓你接觸底層裸機基礎設施的原因, 將更繁重的工作**給更快的語言如c. 這高效能計算和嵌入式程式設計中是關鍵的功能. python效能雞湯第一部分討論了怎樣高效的使用python. 在第二部分, 我們將涉及監控和擴充套件python.

1. 首先, 拒絕調優**

調優給你的**增加複雜性. 整合其它語言之前, 請檢查下面的列表. 如果你的演算法是"足夠好", 優化就沒那麼迫切了. 

1. 你做了效能測試報告嗎? 

2. 你能減少硬碟的 i/o 訪問嗎? 

3. 你能減少網路 i/o 訪問嗎? 

4. 你能公升級硬體嗎? 

5. 你是為其它開發者編譯庫嗎? 

6.你的第三方庫軟體是最新版嗎? 

2.使用工具監控**, 而不是直覺

速度的問題可能很微妙, 所以不要依賴於直覺. 感謝 "cprofiles" 模組, 通過簡單的執行你就可以監控python** 

我們寫了個測試程式. 基於黑盒監控. 這裡的瓶頸是 "very_slow()" 函式呼叫. 我們還可以看到 "fast()" 和 "slow()"都被呼叫200次. 這意味著, 如果我們可以改善 "fast()" 和 "slow()" 函式, 我們可以獲得全面的效能提公升. cprofiles 模組也可以在執行時匯入. 這對於檢查長時間執行的程序非常有用.

3.審查時間複雜度

控制以後, 提供乙個基本的演算法效能分析. 恆定時間是理想值. 對數時間復度是穩定的. 階乘複雜度很難擴充套件. 

o(1) -> o(lg n) -> o(n lg n) -> o(n^2) -> o(n^3) -> o(n^k) -> o(k^n) -> o(n!) 

4.使用第三方包

有很多為python設計的高效能的第三方庫和工具. 下面是一些有用的加速包的簡短列表. 

1. numpy

: 乙個開源的相當於matlab的包 

2. scipy

: 另乙個數值處理庫 

3. gpulib

: 使用gpus加速** 

4. pypy

: 使用 just-in-time 編譯器優化python** 

5. cython

: 將python優碼轉成c 

6. shedskin: 將python**轉成c++

5.使用multiprocessing模組實現真正的併發

因為gil會序列化執行緒, python中的多執行緒不能在多核機器和集群中加速. 因此python提供了multiprocessing模組, 可以派生額外的程序代替執行緒, 跳出gil的限制. 此外, 你也可以在外部c**中結合該建議, 使得程式更快. 

注意, 程序的開銷通常比執行緒昂貴, 因為執行緒自動共享記憶體位址空間和檔案描述符. 意味著, 建立程序比建立執行緒會花費更多, 也可能花費更多記憶體. 這點在你計算使用多處理器時要牢記.

6.本地**

好了, 現在你決定為了效能使用本地**. 在標準的ctypes模組中, 你可以直接載入已程式設計的二進位制庫(.dll 或 .so檔案)到python中, 無需擔心編寫c/c++**或構建依賴. 例如, 我們可以寫個程式載入libc來生成隨機數. 

然而, 繫結ctypes的開銷是非輕量級的. 你可以認為ctypes是乙個粘合操作系庫函式或者硬體裝置驅動的膠水. 有幾個如 swig, cython和boost 此類python直接植入的庫的呼叫比ctypes開銷要低. python支援物件導向特性, 如類和繼承. 正如我們看到的例子, 我們可以保留常規的c++**, 稍後匯入. 這裡的主要工作是編寫乙個包裝器 (行 10~18).

總結: 

我希望這些python建議能讓你成為乙個更好的開發者. 最後, 我需要指出, 追求效能極限是乙個有趣的遊戲, 而過度優化就會變成嘲弄了. 雖然python授予你與c介面無縫整合的能力, 你必須問自己你花數小時的艱辛優化工作使用者是否買帳. 另一方面, 犧牲**的可維護性換取幾毫秒的提公升是否值得. 團隊中的成員常常會感謝你編寫了簡潔的**. 盡量貼近python的方式, 因為人生苦短. :)

Python效能優化

python是資料分析神器。你肯定會遇到效能上的問題,比如一段程式要跑好幾個小時,但其實你優化一下程式,就只花幾分鐘而已。下面是一些效能優化上的建議 1.盡可能地減少io操作 io操作是非常耗時的,相對於cpu運算來說。一次檔案讀取,請取出你後面可能用到的最多資料。2.減少迴圈的使用 盡可能地在一次...

listview效能優化(2)

參考 工作原理 1.listview針對list中每個item,要求adapter給其乙個檢視 getview 2.乙個新的檢視被返回並顯示 如果我們有上億個item要顯示怎麼辦?為每個專案建立乙個新檢視?no!這不可能 android實際上提供了快取檢視 android中有個叫做recycler ...

hibernate 效能優化2

初用hibernate的人也許都遇到過效能問題,實現同一功能,用hibernate與用jdbc效能相差十幾倍很正常,如果不及早調整,很可能影響整個專案的進度。大體上,對於hibernate效能調優的主要考慮點如下 資料庫設計調整 hql優化 api的正確使用 如根據不同的業務型別選用不同的集合及查詢...