讓Python程式碼更快執行的 5 種方法

發表於2015-04-01

不論什麼語言,我們都需要注意效能優化問題,提高執行效率。選擇了指令碼語言就要忍受其速度,這句話在某種程度上說明了Python作為指令碼語言的不足之處,那就是執行效率和效能不夠亮。儘管Python從未如C和Java一般快速,但是不少Python專案都處於開發語言領先位置。

Python很簡單易用,但大多數人使用Python都知道在處理密集型cpu工作時,它的數量級依然低於C、Java和JavaScript。但不少第三方不願贅述Python的優點,而是決定自內而外提高其效能。如果你想讓Python在同一硬體上執行得更快,你有兩個基本選擇,而每個都會有一個缺點:

·您可以建立一個預設執行時所使用的替代語言(CPython的實現)——一個主要的任務,但它最終只會是CPython的一個簡易替代者。

·您也可以利用某些速度優化器重寫現有Python程式碼,這意味著程式設計師要花更多精力編寫程式碼,但不需要在執行時加以改變。

如何進行Python效能優化,是本文探討的主題。下面是五個方法可以在某些方面提高Python程式碼的效能和執行效率。

PyPy

在選擇CPython的簡易替代語言時,PyPy無疑是最佳之選(如Quora就是由它編寫而成)。由於與現有Python程式碼保持高度相容性,PyPy也是預設程式執行時的一個很好選擇。

PyPy使用了Just-in-Time(JIT)即時編譯器,即動態編譯器,與靜態編譯器(如gcc,java等)不同,它是利用程式執行的過程的資料進行優化,擁有同谷歌Chrome V8 JavaScript引擎相同的語言加速技術。本月初,最新版本PyPy 2.5即將釋出,此版本會有一系列的效能改進,提供更全面的如NumPy的支援,用於加速Python效能的共享庫。

Python 3.x必須由單獨的PyPy3專案構建而成。不過,對於邊緣語言特性愛好者來說,儘管預期支援3.3,但實際此版本最多僅支援Python3.2.4及以下版本。

相關連結:http://pypy.org/

Pyston

Pyston是一款Dropbox推出的新的基於JIT的Python實現,使用LLVM編譯器實現程式碼解析與轉換。與PyPy相比,Pyston仍處於初級階段,目前最新版本為Pyston 0.2版,支援有限子集語言的相關特性。Pyston的主要工作包括支援語言的核心功能及提升關鍵指標效能到一個可接受的水平。不久後,Pyston就可以被認為是遠端生產就緒語言。

相關連結:https://github.com/dropbox/pyston

Nuitka

Nuitka 是一個Python的替代品,一些團隊正用它做完全的Python編譯工具,並嘗試將Python程式碼轉譯為其它可高速執行的程式語言。Nuitka(nuitka.net)可以將python程式碼轉換為C++程式碼,然後編譯為可執行檔案,並通過直接呼叫python的api的方式實現從解析語言到編譯語言的轉換,並且在轉換到C++的過程中直接使用python的直譯器,可以保證100%的語法相容。雖然這限制了它的可移植性,但不可否認這個轉換的速度獲得了肯定。

相關連結:http://nuitka.net/

Cython

Cython是Python 的C語言擴充套件。準確說Cython是單獨的一門語言,專門用來寫在Python裡面import用的擴充套件庫。實際上Cython的語法基本上跟Python一致,而Cython有專門的編譯器:先將 Cython程式碼轉變成C(自動加入了一大堆的C-Python API),然後使用C編譯器編譯出最終的Python可呼叫的模組。不過Cython的缺點是,你並不能真正編寫Python程式碼,這樣一來,現有程式碼將不會完全自動轉移成功。

也就是說,Cython在提速方面有很大優勢,它是一個用來快速生成Python擴充套件模組(extention module)的工具。而在Cython,C裡的型別,如int,float,long,char*等都會在必要的時候自動轉成python物件,或者從python物件轉成C型別,在轉換失敗時會丟擲異常,這正是Cython最神奇的地方。另外,Cython對回撥函式的支援也很好。總之,如果你有寫python擴充套件模組的需求,那麼Cython真的是一個很好的工具。

相關連結:http://cython.org/

Numba

Numba綜合了前兩種方法,是Cython的競爭專案。同樣的,numba把Python原始碼通過LLVMPy生成JIT後的.so檔案來加速。不同點在於,Numba是以JIT為主的,加速對原始碼的侵入性較小。而Cython則重點在加速高效能Python模組的開發上,不依賴LLVMPy專案。此外numba還很不成熟,目前相容性相當差。

相關連結:http://numba.pydata.org/

Python創始人Guido van Rossum堅信Python的許多效能問題可以歸結為語言的使用不當。例如,對於CPU消耗過高的處理,可以通過一些方法來加速Python執行——使用NumPy、使用多處理器擴充套件、或藉助外部C程式碼從而避免全域性直譯器鎖(GIL)——Python緩慢的根源。但由於在Python中還沒有可行的GIL替代語言,Python仍將在短期落後於其他語言——甚至可能更長時間。

相關文章