Python 的 3 個主要缺點及其解決方案

pythondict發表於2020-05-04

原文來自Python實用寶典Python的3個主要缺點及其解決方案

Python問世至今已經三十年左右了,但其僅在過去幾年人氣迅速飆升超過了除java和C以外的其他語言。總的來說,Python已經成為教學、學習程式設計和軟體開發的優秀起點,而且其可以成為任何技術棧中有價值的一部分。

不幸的是,這樣的流行程度也會暴露Python的缺點,最顯著且眾所周知的缺點是這三個:運算效能、打包及可執行程式的生成、專案管理雖然這三個缺點都不是非常致命,但是和其他處於上升通道的語言如Julia、Nim、Rust和Go相比,Python的劣勢將越來越明顯。

下面給大家講講Python程式設計師面臨的這三個缺點,以及Python與其第三方工具開發人員提出的解決這些缺點的方法。

缺點一:Python 多執行緒和速度

Python 整體效能緩慢,有限的執行緒和多處理能力是其未來發展的主要障礙。

Python長期以來一直重視程式設計的易用性而不是執行時的速度。當通過使用C或C++編寫的高速外部(如Numpy和Numba)在Python中完成如此多的效能密集型任務時,你會發現Python重視程式設計的易用性也是一種不錯的選擇。但是儘管如此,Python的開箱即用的效能速度依然落後於其他語言,比如說具有同樣簡單語法的Nim和Julia,卻可以被編譯為機器程式碼,具有更高的效能優勢。

Python無法全面利用多核處理器是其長久以來的問題,它確實具有執行緒功能,但它的執行緒功能是侷限於單個核心的。雖然Python可以使用多程式,但是排程和同步這些子程式的結果並不總是有效的

解決方案

目前沒有單一,自上而下的整體解決方案來解決Python的效能問題,不過我們有一系列加速Python的舉措。比如說:

  1. 使用PyPy直譯器替代官方直譯器,PyPy能夠將Python程式碼編譯成機器程式碼,它在僅僅使用Python自帶的模組的程式碼中效果最好,不過現在也可以適用於如numpy這樣的流行的,但是其始終只適合於長期執行的服務,而不是能打包帶走的應用程式。
  2. Cython,Cython能將Python+C混合編碼的.pyx指令碼轉化為C程式碼。該專案最初是為科學和數值計算而設計的,但它可以在大多數情況下使用。
  3. Numba,Numba和Cython類似,主要用於科學計算。
  4. Mypyc,是現在仍在開發的專案,它會將用mypyc型別裝飾器裝飾的程式碼轉化為C.
  5. 優化的Python發行版,比如英特爾針對特殊的處理器和其特殊的數學運算所開發的專門編譯版本。不過儘管它能夠顯著加快部分運算速度,但不能加快整體的運算速度。

如果你是高手,你還能嘗試擺脫一下GIL(全域性直譯器鎖),之所以Python的多執行緒是假的,就是因為GIL的存在:它用來保證Python同時只能有一個執行緒執行。因此從理論上來講,如果你擺脫了GIL,就能進行多執行緒運算,可以提高效能。

還有一個正在進行的專案能夠解決許多速度提升的問題,即重構Python內部C介面的實現,一個不混亂的介面可以使得許多效能的改進成為可能。

缺點二:Python 打包和可執行檔案

即使在Python誕生30年後,Python依然沒有很好的方法來生成可執行檔案(exe程式等)我們只能通過第三方工具解決。而且用起來比較麻煩。

解決方案

  1. pyinstaller 可以打包使用許多如numpy這樣的,但是它必須和這些保持版本一致,這可太難受了。而且它生成的程式比較大,因為把import語句裡所有的內容都封裝在一起了。
  2. 還有種方法也是正在研究中,那就是PyOxidizer專案使用Rust語言生成嵌入Python的二進位制檔案,不過距離成為真正的解決方案還有一段發展路程要走。

缺點三:Python 包管理、專案管理

當你想將一個本地比較複雜的Python工程移植到伺服器上的時候,你就知道Python專案管理是有多蛋疼了你需要不斷地安裝專案依賴,依賴的依賴可能還有依賴,就像俄羅斯俄羅斯套娃一樣,恨不得直接把鍵盤吃了。

解決方案

  1. 這種問題,當然需要Python的開發團隊出手了,需要他們提供一套優雅的遷移工具
  2. 不過他們已經朝這個方向前進幾步了, 根據PEP 518,Python的構建依賴項被合併為pyproject.toml檔案格式(取代了setup.py, requirements.txt, setup.cfg, MANIFEST.in 以及最新加入的Pipfile)
  3. 當然也不是沒有辦法,使用poetry賴管理工具,它能夠很方便地將你所需要的依賴打包在一起。

文章到此就結束啦!如果你看完後覺得有收穫,記得點一下在看,讓更多小夥伴看到這篇文章吧!如果你有其他的小問題,可以在下方視窗留言哦​!

​Python實用寶典 (pythondict.com)

不只是一個寶典

歡迎關注公眾號:Python實用寶典

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Python實用寶典, pythondict.com

相關文章