適合開(kāi)發(fā)者的十大優(yōu)秀Python編譯器
譯文【51CTO.com快譯】由Guido van Rossum于1991年創(chuàng)建的Python,如今已是發(fā)展最快、使用最廣的編程語(yǔ)言之一。它可以在諸如:Web應(yīng)用、桌面開(kāi)發(fā)、機(jī)器學(xué)習(xí)、人工智能、數(shù)據(jù)分析、以及數(shù)據(jù)可視化等領(lǐng)域,得到廣泛的使用。
值得注意的是,近年來(lái),隨著Python生態(tài)系統(tǒng)的不斷發(fā)展壯大,業(yè)界出現(xiàn)了許多代碼庫(kù)、框架、以及編譯器,可用來(lái)加速Python,克服其應(yīng)用限制,甚至能夠?qū)ython與其他編程語(yǔ)言(如:Java、C、C++、JavaScript 等)協(xié)同使用。本文將向您介紹十種可用于將Python代碼,按需編譯為指定輸出格式,以充分釋放Python代碼潛能的優(yōu)秀編譯器。
總的說(shuō)來(lái),目前由官方提供的、使用最廣泛的當(dāng)屬CPython。當(dāng)我們從官網(wǎng)處下載并使用Python時(shí),CPython就是默認(rèn)的編譯處理器。當(dāng)然,在不同的領(lǐng)域和需求場(chǎng)景中,開(kāi)發(fā)人員還會(huì)用到Jython、Brython、PyPy、Skulpt、IronPython、PyJs、Nuitka、WinPython等編譯器。
CPython
作為Python的原配編譯器,CPython是Python語(yǔ)言規(guī)范的參考實(shí)現(xiàn)。因此,它往往能夠最先獲得Python語(yǔ)言的所有最新、最強(qiáng)的功能。顧名思義,它是由純粹的C語(yǔ)言編寫(xiě)而成。當(dāng)然,您不但可以從Python代碼中調(diào)用C源代碼的函數(shù),還可以直接在Python中使用大量現(xiàn)有的C代碼庫(kù)。
值得注意的是,由于CPython在運(yùn)行時(shí)解釋的是字節(jié)碼(bytecode),因此它在每個(gè)進(jìn)程上都會(huì)使用全局解釋器鎖 (global interpreter lock,GIL),以確保在同一時(shí)刻,只有一個(gè)線程正在解釋字節(jié)碼。
當(dāng)我們調(diào)用CPython時(shí),那些在.py文件中編寫(xiě)好的源代碼,首先會(huì)被自動(dòng)編譯成包含了Python字節(jié)碼的.pyc文件,然后在經(jīng)由PVM(Python虛擬機(jī))進(jìn)行解釋。可見(jiàn),CPython其實(shí)是編譯器和解釋器的結(jié)合,而不像C語(yǔ)言那樣,可以直接將源代碼,編譯成為帶有CPU指令的二進(jìn)制機(jī)器碼。
對(duì)于所有學(xué)生和初學(xué)者而言,CPython可以作為您開(kāi)始Python編程之旅的第一步。當(dāng)然,他們也可以使用其他編譯器,讓不同的編程語(yǔ)言與Python混合使用,去實(shí)現(xiàn)更多的特定開(kāi)發(fā)需求。例如,下文將提到的Jython,會(huì)混合Java和Python代碼,利用現(xiàn)有的Java和Python庫(kù),將代碼轉(zhuǎn)換為Java字節(jié)碼,以實(shí)現(xiàn)在JVM上運(yùn)行Python。
Brython
作為JavaScript的“替代品”,Brython可用于在瀏覽器中運(yùn)行包含了Python 3腳本的Web應(yīng)用。也就是說(shuō),開(kāi)發(fā)者只需要在那些運(yùn)行著Python腳本的網(wǎng)頁(yè)上,包含brython.js即可。此處的brython.js是一種能夠在頁(yè)面上查找Python腳本,并通過(guò)Python代碼,以執(zhí)行JavaScript各項(xiàng)操作的引擎。
Python
- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/brython@3.8.10/brython.min.js"> </script> <script type="text/python">Pythoncode here</script>
上面的代碼段展示了,在包含了brython.js之后,您可以使用腳本類型text/python,來(lái)添加Python腳本,并通過(guò)Python代碼,像JavaScript那樣去操作 DOM。
同時(shí),您還可以進(jìn)行Ajax的各種調(diào)用,并訪問(wèn)本地的文件系統(tǒng)。當(dāng)然,您也可以在基于Brython的Python腳本中,包含各種現(xiàn)有的JavaScript庫(kù)和框架,其中包括: Highcharts、vue.js、以及three.js等。
PyPy Python
雖然CPython是在Python中使用最廣泛的編譯器,但它并不是最快的一種。能夠支持Python 2和Python 3核心語(yǔ)言規(guī)范的PyPy,可以替代默認(rèn)的Python實(shí)現(xiàn)。
在CPython中,字節(jié)碼在運(yùn)行時(shí)被解釋,因此性能有所下降。而PyPy采用的是即時(shí)(just-in-time,JIT)的編譯概念。它在代碼執(zhí)行之前,就直接編譯為機(jī)器代碼,因此其執(zhí)行速度提高了接近4倍。
值得注意的是,Python代碼需要執(zhí)行大量耗時(shí)處理的進(jìn)程時(shí),PyPy的速度優(yōu)勢(shì)會(huì)比較明顯。而對(duì)于耗時(shí)較短的進(jìn)程,JIT編譯器本身則可能消耗更多的時(shí)間,并抵消整體的速度優(yōu)勢(shì)。
Jython或JPython
作為使用率第二高的一種Python實(shí)現(xiàn),Jython最初被稱為JPython。它是通過(guò)Python語(yǔ)言來(lái)實(shí)現(xiàn)Java虛擬機(jī)的。
開(kāi)發(fā)者既可以將現(xiàn)有的Java包和代碼庫(kù),導(dǎo)入自己的Python程序中,又可以在Java程序中嵌入Python腳本。無(wú)論是哪種方式,Jython編譯器都會(huì)將帶有Java和Python的整體代碼組合,并編譯成為可以在JVM上運(yùn)行的字節(jié)碼。
正是由于運(yùn)行在JVM上,因此您可以在諸如:Windows、Linux、macOS、FreeBSD、以及Solaris等,幾乎所有的平臺(tái)上創(chuàng)建Jython項(xiàng)目。
Cython
Cython與CPython不同,它更像是一個(gè)超集,允許開(kāi)發(fā)者在代碼中結(jié)合C和Python,從而生成C語(yǔ)言代碼類型的輸出,以供任何一種C/C++編譯器進(jìn)行后續(xù)編譯。
可以說(shuō),Cython兼顧了C語(yǔ)言的速度、Python的靈活性,并且可以作為用Python編寫(xiě)C擴(kuò)展的強(qiáng)大工具。下面是有關(guān)Cython的重要說(shuō)明:
- 開(kāi)發(fā)者可以在Python代碼中使用靜態(tài)類型的聲明
- 可以調(diào)試使用由Cython、Python和C編寫(xiě)的混合源代碼
- 可以使用現(xiàn)有庫(kù)(如:NumPy、SciPy、以及CPython生態(tài)系統(tǒng)中的其他庫(kù)),去構(gòu)建高性能的應(yīng)用
如果說(shuō)使用CPython可以為您提供解釋字節(jié)碼的速度,那么使用Cython則能夠?yàn)槟峁╊A(yù)編譯為機(jī)器原生代碼的速度。
Skulpt
Skulpt是由Graham Scott創(chuàng)建的一個(gè)實(shí)驗(yàn)項(xiàng)目,其流行的速度非??臁W鳛镻ython在瀏覽器內(nèi)的一種實(shí)現(xiàn),Skulpt的主要目的是提供一種良好的在線式Python編譯器。當(dāng)然它也可以通過(guò)讓W(xué)eb應(yīng)用引擎包含Skulpt,以方便開(kāi)發(fā)者編寫(xiě)出被用于前端的Python腳本。
值得一提的是,Skulpt會(huì)先將Python代碼轉(zhuǎn)換為JavaScript,然后在瀏覽器中執(zhí)行相應(yīng)的代碼。
Nuitka
由Kay Hayen開(kāi)發(fā)和維護(hù)的Nuitka,是另一個(gè)用Python編寫(xiě)的編譯器。雖然仍處于反復(fù)迭代之中,但它已經(jīng)對(duì)默認(rèn)的CPython實(shí)現(xiàn)進(jìn)行了運(yùn)行時(shí)(run-time)上的改進(jìn)。
目前,Nuitka的工作原理是將Python代碼編譯為C語(yǔ)言代碼,并利用libPython進(jìn)行最終執(zhí)行。當(dāng)然,Nuitka的最終計(jì)劃是將其替換為原始的純C語(yǔ)言的數(shù)據(jù)類型,而不必再去借用libpython。
注意,Nuitka可以在Apache的許可證下免費(fèi)被使用,并且可以在Linux、Windows、macOS、以及其他平臺(tái)上被設(shè)置使用。
IronPython
于2006年首發(fā)的IronPython,是.NET框架的Python實(shí)現(xiàn)。它支持.NET core和.NET Standard,可以運(yùn)行在Windows、macOS和Linux平臺(tái)上。IronPython之于.NET Framework,就像Jython之于Java。
借助IronPython,開(kāi)發(fā)者可以使用所有的Python庫(kù)、.NET Framework、以及.NET支持的所有語(yǔ)言(如C#)。正是由于IronPython是用C #編寫(xiě)的,因此如果您具有.NET的背景,則可以使用Python擴(kuò)展工具,輕松地為Python設(shè)置VS代碼。當(dāng)然,您可以根據(jù)Apache許可證,免費(fèi)使用該編譯器。
PyJS
PyJS是另一款完全用Python,而非JavaScript或HTML去開(kāi)發(fā)Web應(yīng)用的編譯工具。在后臺(tái),PyJS會(huì)在使用內(nèi)置的Ajax框架之前,將Python代碼編譯為JavaScript。
同時(shí),PyJS帶有一個(gè)桌面版本,以便您能夠在桌面上運(yùn)行被開(kāi)發(fā)應(yīng)用的,功能相對(duì)應(yīng)的Web版本。
WinPython
WinPython是Python的“即用型”發(fā)行版。也就是說(shuō),用戶無(wú)需任何安裝,即可在Windows PC上運(yùn)行。作為另一種Python的實(shí)現(xiàn),WinPython編譯器不僅帶來(lái)了Python執(zhí)行環(huán)境,而且還包含了諸如:Scipy、Numpy、以及Pandas等各種Python庫(kù)。
WinPython的特點(diǎn)在于,它既是面向數(shù)據(jù)科學(xué)家的全功能性科學(xué)環(huán)境,又是面向?qū)W生和初學(xué)者的便捷工具。
Transcrypt
Transcrypt更像是一個(gè)從Python到JavaScript的轉(zhuǎn)換器。也就是說(shuō),您可以使用Transcrypt將自己的Python代碼轉(zhuǎn)換為JavaScript。據(jù)此,您可以在Web應(yīng)用或Node.js服務(wù)器中,使用已編譯的代碼,作為服務(wù)器端的應(yīng)用程序。
通常,Transcrypt會(huì)生成可讀的JavaScript,您可以使用源映射(source maps)和Python源代碼,對(duì)其進(jìn)行調(diào)試。同時(shí),您還可以從該工具中獲得minifier、靜態(tài)類型驗(yàn)證器、以及帶有Typescript的linter。
小結(jié)
上述介紹的十種編譯器,大多能夠使開(kāi)發(fā)人員在自己的項(xiàng)目中混合、或匹配多種語(yǔ)言。當(dāng)然,您也可以從如下方面,去選擇恰當(dāng)?shù)腜ython編譯器:
- 需要利用其他編程語(yǔ)言的現(xiàn)有代碼庫(kù)。
- 缺乏Java、JavaScript、C、甚至Python中某一方面的技能。
- 需加速執(zhí)行Python的運(yùn)行時(shí)。
原文標(biāo)題:The 10 Best Python Compilers for Developers ,作者: Sophia Rodriguez
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】























