Python的3個主要缺點及其解決方案,80%的人都不會

来源:https://www.cnblogs.com/chengxuyuanaa/archive/2020/05/11/12870996.html
-Advertisement-
Play Games

Python 問世至今已經三十年左右了,但其僅在過去幾年人氣迅速飆升超過了除 java 和 C 以外的其他語言。總的來說,Python 已經成為教學、學習編程和軟體開發的優秀起點,而且其可以成為任何技術棧中有價值的一部分。 另外大家要註意:光理論是不夠的。這裡順便總大家一套2020最新python入 ...


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

另外大家要註意:光理論是不夠的。這裡順便總大家一套2020最新python入門到高級項目實戰視頻教程,可以去小編的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 賴管理工具,它能夠很方便地將你所需要的依賴打包在一起。
    最後註意註意:光理論是不夠的。這裡順便總大家一套2020最新python入門到高級項目實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,還可以跟老司機交流討教!

    本文的文字及圖片來源於網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 時間序列 1、時間序列圖 時間序列圖用於可視化給定指標如何隨時間變化。在這裡,您可以瞭解1949年至1969年之間的航空客運流量如何變化。 # Import Data df ...
  • Spring 框架的核心特性是可以用於開發任何 Java 應用程式,但是在 Java EE 平臺上構建 web 應用程式是需要擴展的。 Spring 框架的目標是使 J2EE 開發變得更容易使用。 ...
  • 單例模式,是Java中比較常見的一個設計模式,也是我在面試時經常會問到的一個問題。 經過我的初步統計,基本上有60%左右的人可以說出2-4種單例的實現方式,有40%左右的人可以說出5-6種單例的實現方式,只有20%左右的人能夠說出7種單例的實現。 而只有不到1%的人能夠說出7種以上的單例實現。 其實 ...
  • 你是否有過這麼一段經歷,一直做著OA,CRM管理系統等傳統項目,簡歷技能開頭第一行,基本都是“Java基礎扎實”,然後下麵接著就是熟悉XXX。然後不斷列名詞,舉例一下: Java基礎扎實 熟悉Mysql… 熟悉Redis… 熟悉HTML/CSS/JS… 這個,是否就是你的簡歷套路??? 但是你發現, ...
  • 面試的時候,很多人都小心翼翼,如履薄冰,生怕自己說錯一句話,就錯失機會,擔心,面試緊張、卡殼、答不上來怎麼辦? 被面試官弔打,碾壓,是常態,畢竟大多數面試官工作經驗和技術都更加豐富嘛。 但是,術業有專攻,總有一些技術牛逼的程式員可以弔打、碾壓面試官! 本人經常隔段時間就偷偷投點簡歷,請假出去面試幾次 ...
  • 一個小伙伴最近參加某一線互聯網公司的面試,被問到了一些併發相關的問題,看看大家能否答出來: (1)synchronized的CPU原語級別是如何實現的? (2)無鎖、偏向鎖、輕量級鎖、重量級鎖有什麼差別,升級過程如何? (3)線程間通信,同機器進程間通信,跨機器進程間通信,各有什麼方法? (4)下列 ...
  • 先扯些這些內容: TCP/IP TCP/IP是個協議組,可分為三個層次:網路層、傳輸層和應用層。 在網路層有IP協議、ICMP協議、ARP協議、RARP協議和BOOTP協議。 在傳輸層中有TCP協議與UDP協議。 在應用層有: TCP包括FTP、HTTP、TELNET、SMTP等協議 UDP包括DN ...
  • 1.學前知識 1.1視頻碼率值 碼率公式: 碼率(kbps)=文件大度小(KB)*8/時間(秒) 所以碼率和視頻文件大小成正比的,不過碼率超過一定值後,人眼是看不出效果的. 接下來,我們便先來學習ffmpeg命令使用 2.ffmpeg常用命令使用 ffmpeg命令- 用於轉碼的應用程式, 也可以從u ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...