首頁>技術>

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

Python程式碼簡潔乾淨,但是大家都知道Python執行起來相對較慢 --- 在CPU密集型的任務上慢於C、Java和Javascript(但是大多數服務都不是CPU密集型的)--- 但是有些團隊希望Python是盡善盡美的,所以他們準備從內而外地提升Python的效能。

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

a. 你可以建立一個Python執行時的替代品,但是最後你會發現你重寫了一遍CPython。

b. 你可以重寫現存的部分程式碼來利用一些效能最佳化的特性,缺點是程式設計師需要做更多的工作。

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

PyPy

在CPython的替代品中,PyPy是最顯眼的那一個(比如Quora就在生產環境中使用它)。它也最有機會成為預設直譯器,它和現存Python程式碼高度相容。

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

Pyston

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

除了替換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鎖目前還無法被替代,所以有很多專案開始嘗試一些短期可行的替代方案,當然這些方案也可能轉變為長期的可選項。

23
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • SpringCloud2020正式釋出,再見了Netflix