Python - Need For Speed
何謂 Python
Python 是近幾年非常流行的動態語言, 由 Guido van Rossum 設計並於 1991 年釋出, 語言設計注重可讀性, 特色包含(列出部份):
直譯式
語法簡單
使用縮排來分 Scope (因此 Python 程式碼都一定具有某種程度的排版)
動態型別
強型別 (強弱是相對的,但 Python 仍被規在強型別)
Duck Typing
物件導向
Garbage Collection (程式設計師不需要寫任何程式碼來自己控管記憶體使用)
豐富的 Standard Library
Python 常被當作腳本語言來處理系統管理或網路相關程式的撰寫, 而現今(2016)也有許多作業系統在裝好後就會直接內建 Python, 讓 Python 在各平台的取得變得相對容易。 近幾年 Python 在科學運算上也被大量使用, 出現 NumPy、SciPy、Matplotlib 等眾多科學運算和繪製的豐富 Libraries。
在如此廣泛的使用下, Python 的效能議題也不斷地被提起, 如何讓 Python 程式的效能可以往 C 這種編譯式程式語言靠近變成值得研究議題。
當心中浮現效能
在提到效能時, 我們需要先了解到程式吃重的地方是 CPU 運算還是 I/O 存取, 以下討論的情況都是 CPU 運算吃重。 而以現今的硬體來說, 有很多地方是值得注意的, 我們先來看看針對 CPU 運算吃重有哪些改進的方向後再決定走向。
我們先簡化一點狀況做討論, 在只考慮軟體而不考慮硬體的情況下, 我們可能會想到以下幾種地方(歡迎補充):
改善程式演算法(就算是同硬體,使用效率較高的演算法可以讓速度快上很多倍)
刪減需要執行的程式碼量(減少不必要的程式碼可以降低需要運算的次數)
在只考慮單核心 CPU 的情況下, 我們可能會想到以下幾種地方(歡迎補充):
有效利用硬體的指令集(例如在使用 GCC 或 Clang 編譯 C 程式時加上
-march=native
)有效使用 CPU 內的 Cache (減少 Cache Misses 來降低記憶體存取量)
以現在的硬體來說, CPU 內通常都有數個 Cores, 甚至在某些硬體內會有數個 CPU 的狀況, 因此在考慮多核心的情況下, 我們可能會想到以下幾種地方(歡迎補充):
Multithreading
Multiprocessing
(目的都是要讓 CPU 的數顆核心同時運作, 其中資料的共享機制又會是另外一個大議題)
再把規模往上加, 我們可能會有數臺機器可以一起執行, 因此在考慮多機器的情況下, 我們可能會想到以下幾種地方(歡迎補充):
把事情切割給其他數臺機器做運算後再整合
另外近幾年還盛行把 GPU 拿來做數值相關的運算, 該技術被稱為 GPGPU, 在使用 GPU 的情況下, 我們可能會想到以下幾種地方(歡迎補充):
CUDA
OpenCL
對於需要語言 Virtual Machine 的直譯式語言, 還有 Virtual Machine 可以改進: 我們可能會想到以下幾種地方(歡迎補充):
改善 Virtual Machine 的運作方式
使用其他較有效率的程式語言所撰寫的功能(例如 Foreign Function Interface)
JIT (即時編譯)(轉換成優化更多的形式可以減少需要的 CPU 運算量)
Garbage Collection (更有效率地管理記憶體可以獲得需多效能提升)
轉換成編譯式語言做編譯