還能更快!讓 Python 變快的 5個方案


Python 的運行速度確實沒有 C 或者 Java 快,但是有一些項目正在努力讓 Python 變得更快。

Python 代碼簡潔干凈,但是大家都知道 Python 運行起來相對較慢。在 CPU 密集型的任務上慢於 C、Java 和 Javascript,但是有些團隊希望 Python 是盡善盡美的,所以他們准備從內而外地提升 Python 的性能。

如果你想讓 Python 在特定硬件上運行得快一點,你至少有兩個選擇,每個選擇都有一些弊病:

  • 你可以創建一個 Python 運行時的替代品,但是最后你會發現你重寫了一遍 CPython。

  • 你可以重寫現存的部分代碼來利用一些性能優化的特性,缺點是程序員需要做更多的工作。

 

下面是五種已有的方案,幫助你提高 Python 的性能。

 

一、PyPy

在 CPython 的替代品中,PyPy 是最顯眼的那一個(比如 Quora 就在生產環境中使用它)。它也最有機會成為默認解釋器,它和現存 Python 代碼高度兼容。

 

PyPy 使用適時編譯來加速 Python,這項技術 Google 也在使用,Google 在 V8 引擎中使用它加速 Javascript。最近的版本 PyPy2.5 增加了一些提升性能的特性,其中有一項很受歡迎,它集成了 Numpy,Numpy 之前也一直被用來加速 Python 的運行。

使用 Python3 的代碼需要對應地使用 PyPy3。PyPy 目前只支持到 Python3.2.5,對 Python3.3 的支持正在進行中。

 

二、Python

Pyston,由 Dropbox 資助,使用 LLVM 編譯器架構來加速 Python,同樣的它也使用了適時編譯。相比於 PyPy,Pyston 還處於早期階段,它只支持 Python 的部分特性。Pyston 把工作分成兩個部分,一部分是語言的核心特性,另一部分是把性能提升到可接受的程度。Pyston 距離可以在生產環境使用還有一段距離。

 

三、Nuitka

除了替換 Python 運行時,有些團隊嘗試將 Python 代碼轉換為能夠在本地高效運行的其他語言的代碼。其中著名的項目是 Nuitka-- 把 Python 代碼轉換為 C++ 代碼 -- 雖然運行時還是依賴 Python 運行時。這樣限制了它的可移植性,不過性能提升是可觀的。長期規划中,Nuitka 還准備讓 C 語言能夠調用 Nuitka 編譯的 Python 代碼,這樣性能提升將更加明顯。

 

四、Cython

Cython(Python 的 C 語言擴展)是 Python 的超集,它能把 Python 代碼編譯成 C 代碼,並與 C 和 C++ 進行交互。它可以作為 Python 項目的擴展使用(重新性能要求高的部分),或者單獨使用,不涉及傳統的 Python 代碼。缺點是你寫的不是 Python,所以需要手動遷移,缺乏可移植性。

據說,Cython 提供了一些特性來讓代碼更高效,比如變量類型化,這本質上是 C 要求的。一些科學計算的包,如 scikit-learn 依賴 Cython 的一些特性來保持操作簡潔快速。

 

五、Numba

Numba 結合了上面幾個項目的想法。學習了 Cython,Numba 也采用了部分加速的策略,只加速 CPU 密集型的任務;同時它又學習了 PyPy 和 Pyston,通過 LLVM 運行 Python。你可以用一個裝飾器指定你要用 Numba 編譯的函數, Numba 繼承 Numpy 來加速函數的執行,Numba 不做適時編譯,它的代碼是預先編譯的。


Python 之父說:大部分覺得 Python 慢的應用都是沒有正確地使用 Python。對於 CPU 密集型的任務有多種方法來提升性能--使用 Numpy 來做計算,調用外部 C 代碼,以及盡量避免 GIL 鎖。由於 GIL 鎖目前還無法被替代,所以有很多項目開始嘗試一些短期可行的替代方案,當然這些方案也可能轉變為長期的可選項。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM