Anaconda、CPython以及更多:關(guān)于各Python發(fā)行版,我們需要了解的一切
譯文【51CTO.com快譯】在本文中,我們將探討Python語言的各類運(yùn)行時(shí)與發(fā)行版選項(xiàng),并探討其各自適合哪些用例。
在選擇Python語言進(jìn)行軟件開發(fā)時(shí),我們面對(duì)的實(shí)際是一套大型語言生態(tài)系統(tǒng)——其中包含各類涵蓋無數(shù)編程需求的軟件包。但除了從GUI開發(fā)到機(jī)器學(xué)習(xí)的各類庫之外,各位還能夠從多種Python運(yùn)行時(shí)中作出選擇——其中部分運(yùn)行時(shí)也許更適合您當(dāng)前的用例條件。
下面,我們將簡單介紹目前最常用的幾款Python發(fā)行版——從標(biāo)準(zhǔn)實(shí)現(xiàn)(CPython)到針對(duì)速度進(jìn)行優(yōu)化的版本(PyPy),再到特殊用例(Anaconda、ActivePython)乃至最初為完全不同的其他語言設(shè)計(jì)的運(yùn)行時(shí)(Jython、IronPython)。
目錄
- CPython
- Anaconda Python
- ActivePython
- PyPy
- Jython
一、CPython
CPython屬于Python參考實(shí)現(xiàn)方案,可算是所有其他Python衍生發(fā)行版的一套標(biāo)準(zhǔn)化版本。CPython利用C語言編寫而成,而其編寫者包含多位Python語言頂級(jí)決策層中的核心人員。
1.CPython用例
CPython屬于Python的參考實(shí)現(xiàn)版本,因?yàn)槠湓趦?yōu)化方面表現(xiàn)得最為保守。當(dāng)然,這并不是缺點(diǎn),而是設(shè)計(jì)取向。Python的維護(hù)者們希望將CPython打造為Python最具廣泛兼容性與標(biāo)準(zhǔn)化的實(shí)現(xiàn)方案。
CPython最適合對(duì)Python標(biāo)準(zhǔn)的兼容性與一致性要求較高的用戶。此外,CPython同樣適用于希望以最基本方式使用Python并愿意為此放棄某些便捷性的專業(yè)人士。
舉例來說,您需要進(jìn)行些許調(diào)整才能利用CPython設(shè)置虛擬環(huán)境。而其他發(fā)行版(Anaconda)則在工作區(qū)設(shè)置中提供更多自動(dòng)化功能。
2.CPython的局限性
CPython并不像Python的其他版本那樣對(duì)性能作出深度優(yōu)化。其不提供原生JIT(即時(shí))編譯器,不提供加速數(shù)學(xué)庫,也沒有用于提升性能的第三方附加選項(xiàng)。
您當(dāng)然可以根據(jù)需求自行添加,但其并不直接提供綁定包。當(dāng)然,這一切都是設(shè)計(jì)取向所決定,旨在確保CPython作為一套參考實(shí)現(xiàn)版本能夠最大程度實(shí)現(xiàn)兼容性與標(biāo)準(zhǔn)化。而性能優(yōu)化——開發(fā)人員可以選擇其他配合工具包進(jìn)行添加。
此外,CPython僅提供一組用于使用Python的基準(zhǔn)性工具。舉例來說,pip軟件包管理器會(huì)從Python原生PyPI軟件包庫當(dāng)中獲取并安裝各軟件包。如果開發(fā)者允許,Pip甚至可以安裝經(jīng)過預(yù)編譯的二進(jìn)制文件(通過輪盤發(fā)布格式),但無法安裝PyPI所不包含的任何其他軟件包依賴項(xiàng)。
二、Anaconda Python
Anaconda源自Anaconda公司之手(原名為Continuum Analytics),其設(shè)計(jì)目標(biāo)在于服務(wù)那些需要由商業(yè)供應(yīng)商提供支持且具備企業(yè)支持服務(wù)的Python開發(fā)者。Anaconda Python的主要用例包括數(shù)學(xué)、統(tǒng)計(jì)學(xué)、工程、數(shù)據(jù)分析、機(jī)器學(xué)習(xí)以及其他相關(guān)應(yīng)用。
1.Anaconda Python用例
Anaconda捆綁有Python商業(yè)與科學(xué)使用場景當(dāng)中的各類常用庫——包括SciPy、NumPy以及Numba等等,同時(shí)通過一套定制化軟件包管理系統(tǒng)提供更多庫訪問能力。
Anaconda最為出色的特性在于將上述元素進(jìn)行了高效組合。在安裝之后,Anaconda提供桌面應(yīng)用程序Anaconda Navigator,可通過方便的GUI幫助用戶使用Anaconda環(huán)境中的各類功能。相較于CPython,Anaconda當(dāng)中的組件搜索、更新以及使用流程都更為簡便。
其另一大優(yōu)勢,在于Anaconda能夠根據(jù)特定軟件包的需求處理Python生態(tài)系統(tǒng)之外的組件。其中專門為Anaconda打造的conda軟件包管理器能夠根據(jù)外部軟件要求安裝Python以及第三方軟件包。
2.Anaconda Python的局限性
由于Anaconda當(dāng)中包含大量實(shí)用性庫,且只需要簡單操作即可安裝更多庫,因此Anaconda的安裝體積往往要比CPython大得多。基本CPython安裝運(yùn)行大約需要100 MB空間,而Anaconda則會(huì)很快增長至GB級(jí)別。如果您的資源有限,那么這有可能產(chǎn)生問題。
幫助Anaconda瘦身的方法之一在于安裝Miniconda,這是一套精簡版本的Anaconda,其中只包含啟動(dòng)與運(yùn)行所必需的部分。如果必要,您可以將軟件包添加到Miniconda當(dāng)中,并關(guān)注各軟件包具體要消耗多少空間。
三、ActivePython
與Anaconda類似,ActivePython同樣由營利性企業(yè)創(chuàng)建及維護(hù)——ActiveState公司。該公司還在銷售多種語言運(yùn)行時(shí)以及多語言Komodo IDE。
1.ActivePython用例
ActivePython主要面向企業(yè)用戶與數(shù)據(jù)科學(xué)家——即希望使用Python語言,但又不愿把大量精力浪費(fèi)在Python的組裝與管理方面。ActivePython使用Python中的常規(guī)pip軟件包管理器,但同時(shí)亦以認(rèn)證壓縮包的形式提供數(shù)百套通用庫,外加英特爾數(shù)學(xué)核心庫等其他一些具有第三方依賴關(guān)系的公共庫。
2.ActivePython的局限性
ActivePython對(duì)軟件包外部依賴關(guān)系的處理方式存在一大潛在缺點(diǎn)。如果大家希望將現(xiàn)有項(xiàng)目(例如TensorFlow)升級(jí)至具有復(fù)雜依賴關(guān)系的較新版本,則需要同時(shí)升級(jí)ActivePython。如果開發(fā)工作在與特定版本的項(xiàng)目相關(guān)聯(lián)的環(huán)境中進(jìn)行,那么這并不會(huì)造成影響。但目前的開發(fā)工作往往需要緊跟前沿版本的發(fā)布,在這種情況下大家往往會(huì)遇到很多麻煩。
四、PyPy
PyPy 屬于CPython解釋器的替代品,其利用即時(shí)(JIT)編譯以加速Python程序的執(zhí)行。根據(jù)實(shí)際執(zhí)行的任務(wù)情況,其性能提升可能非常顯著。
1.PyPy用例
人們對(duì)于Python——特別是CPython的抱怨之聲,主要圍繞其速度表現(xiàn)展開。在默認(rèn)情況下,Python的運(yùn)行速度遠(yuǎn)不及C語言——差距甚至可能達(dá)到數(shù)百倍。PyPy JIT將Python代碼編譯為機(jī)器語言,從而帶來平均7.7倍于CPython的運(yùn)行速度。在某些特定任務(wù)中,其提速效果能夠達(dá)到50倍。
更重要的是,開發(fā)人員能夠較為輕松地享受到這些便利。將CPython換成PyPy,您就基本完成了提速工作。
2.PyPy的局限性
PyPy一般更適用于處理“純”Python應(yīng)用程序。由于PyPy會(huì)模擬CPYthon的原生二進(jìn)制接口,因此在處理NumPy等包含C庫接口的Python軟件包時(shí),其表現(xiàn)并不理想。不過隨著時(shí)間推移,PyPy的開發(fā)者們已經(jīng)逐步解決了這個(gè)問題,并使得PyPy能夠更好地同依賴于C擴(kuò)展的Python軟件包進(jìn)行兼容。但必須承認(rèn),雖然已經(jīng)有所改善,PyPy對(duì)C擴(kuò)展的支持仍然有限。
PyPy的另一大短板在于運(yùn)行時(shí)大小。Windows上的核心CPython運(yùn)行時(shí)——不包含標(biāo)準(zhǔn)庫——約為4 MB,而PyPy運(yùn)行時(shí)則在32 MB左右。同樣需要注意的是,PyPy還長期立足Python的2.x分支,例如目前面向Python 3.x版本的PyPy目前只在32位Windows系統(tǒng)上提供beta測試版本。(PyPy已經(jīng)在Linux與MacOS上提供同時(shí)面向Python 2x與3.x的64位版本。)
五、Jython
JVM(Java虛擬機(jī))能夠作為除Java之外的多種語言的運(yùn)行時(shí)選項(xiàng)。這份長的名單包括Groovy、Scala、Clojure、Kotlin、Python以及——沒錯(cuò),當(dāng)然還有Jython 。
1.Jython用例
Jython項(xiàng)目能夠?qū)ython 2.x編譯為JVM字節(jié)碼,并在JVM上運(yùn)行生成的程序。在某些情況下,Jython編譯的程序在運(yùn)行速度上甚至高于CPython編譯程序——但并非始終如此。
Jython提供的最大優(yōu)勢在于能夠與Java生態(tài)系統(tǒng)中的其他部分直接進(jìn)行互操作。Java的使用范圍比Python更為廣泛。通過在JVM上運(yùn)行Python,開發(fā)人員將能夠享受并非為Python開發(fā)的龐大庫與框架生態(tài)系統(tǒng)。同樣,Jython亦允許Java開發(fā)人員使用Python庫。
2.Jython的局限性
Jython最大的弊端在于其僅支持Python的2.x版本。目前對(duì)Python 3.x版本的支持能力尚在開發(fā)當(dāng)中,但仍需要相當(dāng)一段時(shí)間。當(dāng)下,還沒有任何相關(guān)版本放出。
同樣需要注意的是,雖然Jython能夠?qū)ython引入JVM,但卻無法將Python引入Android。由于Jython目前不具備適用于Android的端口,因此Jython不能用于開發(fā)Andoird應(yīng)用。
六、IronPython
類似于Jython的JVM上Python實(shí)現(xiàn)方案定位,IronPython屬于一套立足.Net運(yùn)行時(shí)——或者CLR(公共語言運(yùn)行時(shí))——的Python實(shí)現(xiàn)方案。IronPython利用CLR的DLR(動(dòng)態(tài)語言運(yùn)行時(shí))以允許Python程序以等同于CPython的動(dòng)態(tài)水平實(shí)現(xiàn)運(yùn)行。
1.IronPython 用例
與Jython類似,IronPython同樣屬于一種橋梁。其最主要的用例在于實(shí)現(xiàn)Python與.Net間的互操作性。現(xiàn)有.Net程序集能夠利用Python的本地導(dǎo)入與對(duì)象操作語法在IronPython程序中實(shí)現(xiàn)加載。
此外,我們也可以將IronPython代碼編譯成程序集,并直接運(yùn)行或者接受其他語言的調(diào)用。但需要注意的是,其中的MSIL(微軟中間語言)無法直接由其他.Net語言進(jìn)行訪問,因?yàn)槠洳⒉恢С止舱Z言規(guī)范。
2.IronPython的局限性
與Jython類似,IronPython目前只支持Python 2.x版本。不過IronPython 3.x實(shí)現(xiàn)方案已經(jīng)處于緊鑼密鼓的開發(fā)當(dāng)中。
原文標(biāo)題:Anaconda, CPython, PyPy, and more: Know your Python distributions,作者:Serdar Yegulalp
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】