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 (更有效率地管理記憶體可以獲得需多效能提升)

  • 轉換成編譯式語言做編譯