Python問世至今已經(jīng)三十年左右了,但其僅在過去幾年人氣迅速飆升超過了除java和C以外的其他語言??偟膩碚f,Python已經(jīng)成為教學(xué)、學(xué)習(xí)編程和軟件開發(fā)的優(yōu)秀起點(diǎn),而且其可以成為任何技術(shù)棧中有價值的一部分。
不幸的是,這樣的流行程度也會暴露Python的缺點(diǎn),最顯著且眾所周知的缺點(diǎn)是這三個:運(yùn)算性能、打包及可執(zhí)行程序的生成、項(xiàng)目管理
雖然這三個缺點(diǎn)都不是非常致命,但是和其他處于上升通道的語言如Julia、Nim、Rust和Go相比,Python的劣勢將越來越明顯。
下面給大家講講Python程序員面臨的這三個缺點(diǎn),以及Python與其第三方工具開發(fā)人員提出的解決這些缺點(diǎn)的方法。
缺點(diǎn)一:Python 多線程和速度
Python 整體性能緩慢,有限的線程和多處理能力是其未來發(fā)展的主要障礙。
Python長期以來一直重視編程的易用性而不是運(yùn)行時的速度。當(dāng)通過使用C或C++編寫的高速外部庫(如Numpy和Numba)在Python中完成如此多的性能密集型任務(wù)時,你會發(fā)現(xiàn)Python重視編程的易用性也是一種不錯的選擇。但是盡管如此,Python的開箱即用的性能速度依然落后于其他語言,比如說具有同樣簡單語法的Nim和Julia,卻可以被編譯為機(jī)器代碼,具有更高的性能優(yōu)勢。
Python無法全面利用多核處理器是其長久以來的問題,它確實(shí)具有線程功能,但它的線程功能是局限于單個核心的。雖然Python可以使用多進(jìn)程,但是調(diào)度和同步這些子進(jìn)程的結(jié)果并不總是有效的
解決方案
目前沒有單一,自上而下的整體解決方案來解決Python的性能問題,不過我們有一系列加速Python的舉措。比如說:
使用PyPy解釋器替代官方解釋器,PyPy能夠?qū)ython代碼編譯成機(jī)器代碼,它在僅僅使用Python自帶的模塊的代碼中效果最好,不過現(xiàn)在也可以適用于如numpy這樣的流行的庫,但是其始終只適合于長期運(yùn)行的服務(wù),而不是能打包帶走的應(yīng)用程序。Cython,Cython能將Python+C混合編碼的.pyx腳本轉(zhuǎn)化為C代碼。該項(xiàng)目最初是為科學(xué)和數(shù)值計(jì)算而設(shè)計(jì)的,但它可以在大多數(shù)情況下使用。Numba,Numba和Cython類似,主要用于科學(xué)計(jì)算。Mypyc,是現(xiàn)在仍在開發(fā)的項(xiàng)目,它會將用mypyc類型裝飾器裝飾的代碼轉(zhuǎn)化為C.優(yōu)化的Python發(fā)行版,比如英特爾針對特殊的處理器和其特殊的數(shù)學(xué)運(yùn)算所開發(fā)的專門編譯版本。不過盡管它能夠顯著加快部分運(yùn)算速度,但不能加快整體的運(yùn)算速度。如果你是高手,你還能嘗試擺脫一下GIL(全局解釋器鎖),之所以Python的多線程是假的,就是因?yàn)镚IL的存在:它用來保證Python同時只能有一個線程運(yùn)行。因此從理論上來講,如果你擺脫了GIL,就能進(jìn)行多線程運(yùn)算,可以提高性能。
還有一個正在進(jìn)行的項(xiàng)目能夠解決許多速度提升的問題,即重構(gòu)Python內(nèi)部C接口的實(shí)現(xiàn),一個不混亂的接口可以使得許多性能的改進(jìn)成為可能。
缺點(diǎn)二:Python 打包和可執(zhí)行文件
即使在Python誕生30年后,Python依然沒有很好的方法來生成可執(zhí)行文件(exe程序等)
我們只能通過第三方工具解決。而且用起來比較麻煩。
解決方案
pyinstaller 可以打包使用許多如numpy這樣的庫,但是它必須和這些庫保持版本一致,這可太難受了。而且它生成的程序比較大,因?yàn)榘裪mport語句里所有的內(nèi)容都封裝在一起了。還有種方法也是正在研究中,那就是PyOxidizer項(xiàng)目使用Rust語言生成嵌入Python的二進(jìn)制文件,不過距離成為真正的解決方案還有一段發(fā)展路程要走。缺點(diǎn)三:Python 包管理、項(xiàng)目管理
當(dāng)你想將一個本地比較復(fù)雜的Python工程移植到服務(wù)器上的時候,你就知道Python項(xiàng)目管理是有多蛋疼了
你需要不斷地安裝項(xiàng)目依賴,依賴的依賴可能還有依賴,就像俄羅斯俄羅斯套娃一樣,恨不得直接把鍵盤吃了。
解決方案
這種問題,當(dāng)然需要Python的開發(fā)團(tuán)隊(duì)出手了,需要他們提供一套優(yōu)雅的遷移工具。不過他們已經(jīng)朝這個方向前進(jìn)幾步了, 根據(jù)PEP 518,Python的構(gòu)建依賴項(xiàng)被合并為pyproject.toml文件格式(取代了setup.py, requirements.txt, setup.cfg, MANIFEST.in 以及最新加入的Pipfile)當(dāng)然也不是沒有辦法,使用poetry依賴管理工具,它能夠很方便地將你所需要的依賴打包在一起。文章到此就結(jié)束啦!如果你看完后覺得有收獲,記得點(diǎn)一下在看,讓更多小伙伴看到這篇文章吧!如果你有其他的小問題,可以在下方窗口留言哦?!
?Python實(shí)用寶典 (pythondict.com)
不只是一個寶典
歡迎關(guān)注公眾號:Python實(shí)用寶典
掃描二維碼推送至手機(jī)訪問。
版權(quán)聲明:本文由信途科技轉(zhuǎn)載于網(wǎng)絡(luò),如有侵權(quán)聯(lián)系站長刪除。
轉(zhuǎn)載請注明出處http://www.quickersubmitter.com/xintu/12663.html