Python 現在如此火爆,已發展成為一種非常通用的語言,無論是從入門級選手到專業技術數據挖掘、科學計算、圖像處理、人工智慧,Python 都可以勝任。它會是未來的程式語言嗎?它是完美無缺的程式語言嗎?有人發出了不同的聲音。此前,InfoQ 中文站曾編譯過相關文章,今天,我們翻譯並分享了 Rhea Moutafis 對 Python 的看法,權當一家之言吧!
編程社區花了幾十年的時間才領略到 Python 迷人之處。但自 2010 年初以來,Python 就一直在蓬勃發展,並最終在受歡迎程度上超越了 C、C#、Java 和 JavaScript。
但這種趨勢還會持續到什麼時候呢?什麼時候 Python 最終會被其他程式語言所取代?為什麼會被取代?
要給 Python 設定一個確切的「死期」可能是一個很大的猜測。它可能會像科幻小說一樣。相反,我在本文中,將闡述 Python 那些受歡迎的優點,以及將來會打敗它的弱點。
是什麼讓 Python 現在如此流行
Python 的成功提現在 Stack Overflow 趨勢上,該趨勢衡量平臺上帖子中的標籤數量。鑑於 Stack Overflow 的規模,因此它是程式語言受歡迎程度的一個很好的指標。
Stack Overflow 上各種程式語言的標籤快照。
儘管 R 語言在過去幾年裡一直處於停滯不前的狀態,而且許多其他程式語言也在穩步下降,但 Python 的增長似乎勢不可擋。幾乎所有 Stack Overflow 上的問題有 14% 被標記為「Python」,而且這一趨勢還在上升。
這其中有幾個原因:
它是古老的
Python 早在 20 世紀 90 年代就出現了。這並不僅僅意味著它有充足的時間來成長,它還得到了一個龐大的支持社區。
因此,如果你在用 Python 編寫代碼遇到了什麼問題,你很有可能通過 Google 搜索一下就能解決。這是因為有人已經遇到過和你一樣的問題,並記下了一些有用的東西。
它對初學者很友好
這不僅是事實,因為它已經存在了幾十年,讓程式設計師得以有時間來編寫優秀的教程。更重要的是,Python 的語法非常易於理解。
首先,無需指定數據類型。你只需聲明一個變量即可;Python 將會從上下文中理解它是整數、浮點值、布爾值還是其他值。這對初學者來說,是一個巨大的優勢。如果你曾經使用 C++ 進行編程的話,你就會知道你的程序無法通過編譯是多麼令人沮喪,僅僅只是因為你將浮點數換成了整數。
如果你曾經同時閱讀過 Python 和 C++ 代碼,你就會知道 Python 有多麼容易理解。儘管 C++ 在設計時考慮到了英語,但與 Python 代碼相比,它的閱讀還是相當困難。
它的用途廣泛
由於 Python 已經存在了如此久的時間,開發人員已經為各種潛在需求製作了軟體包。現在,你可以找到幾乎所有用途的軟體包。
想要計算數字、向量和矩陣嗎?NumPy就是你要找的東西。
想要做技術和工程方面的計算嗎?請使用 SciPy。
想在數據處理和分析方面做大嗎?那就試試 Pandas 吧。
想從人工智慧開始嗎?那為什麼不使用 Scikit-Learn 呢?
無論你想做哪種計算任務,都有相應的 Python 軟體包。這使得 Python 一直處於發展前沿,從過去幾年機器學習的火熱的浪潮中可以看出來。
Python 的缺點以及這些缺點是否會致命
基於前面的闡述,你可以想像 Python 在未來幾年仍將興盛不衰。但是,像所有的技術一樣,Python 也有它的弱點。我將一一介紹最重要的缺陷,並評估這些缺陷是否致命。
速度
Python 很慢。真的,非常非常慢。平均而言,使用 Python 完成一項任務所需的時間,是任何其他程式語言的 2~10 倍。
造成這種情況的原因有很多。其中之一是,它是動態類型的,記住,你不需要像在其他程式語言那樣指定數據類型。這意味著需要使用大量的內存,因為程序需要為它在任何情況下都能工作的每個變量預留足夠的空間。而且大量的內存使用意味著大量的計算時間。
另一個原因是,Python 一次只能執行一個任務。這是靈活數據類型的結果:Python 需要確保每個變量只有一種數據類型,而並行化的進程可能會弄亂這一點。
相比之下,一般的 Web 瀏覽器可以同時運行十幾個不同的線程。此外,還有其他一些理論。
但說到底,這些速度問題都無關緊要。計算機和伺服器已經變得如此便宜,以至於我們談論的只是幾分之一秒的時間。實際上,最終用戶並不在乎他們的應用程式是在 0.001 秒還是 0.01 秒內加載的。
作用域
最初,Python 的作用域是動態的。這基本上意味著,要計算表達式,編譯器首先搜索當前塊,然後依次搜索所有調用函數。這就是大多數現代程式語言使用靜態作用域的原因。
Python 曾試圖過渡到靜態作用域,但搞砸了。通常情況下,內部作用域(例如函數中的函數)能夠查看和更改外部作用域。但在 Python 中,內部作用域只能看到外部作用域,而不能改變它們,這就導致了很多混亂的情形。
Lambda
儘管 Python 具有所有的靈活性,但 Lambda 的使用還是相當受限的。Lambda 只能是 Python 中的表達式,不能是語句。
另一方面,變量聲明和語句始終是語句。這意味著 Lambda 並不能用於它們。
表達式和語句之間的這種區別是相當隨意的,在其他程式語言中並不會存在。
空白使代碼的可讀性更強,但可維護性卻更低了。
在 Python 中,你可以使用空格和縮進來表示不同級別的代碼。這使得它在視覺上具有吸引力,理解起來也更直觀。
其他程式語言,如 C++,則更多地依賴花括號和分號。儘管這可能在視覺上不夠吸引人,對初學者也不太友好,但是它使代碼更易於維護。對於較大的項目,這個方法更有用。
像 Haskell 這樣的新語言解決了這個問題:它們依賴於空格,但為那些希望不使用空格的人提供了另一種語法。
移動開發
我們正在見證從臺式計算機到智慧型手機的轉變,很明顯,我們需要強大的語言來開發移動軟體。
但使用 Python 開發的移動應用並不多。不過,這並不意味著它做不到 — 有一個名為 Kivy 的 Python 軟體包就是專門用於開發移動應用的。
但是 Python 在設計時並沒有考慮到移動開發。因此,即使它可能會為基本任務產生差強人意的結果,你最好的選擇是使用一種專為移動開發而創建的程式語言。一些廣泛使用的移動編程框架包括 React Native、Flutter、Iconic 和 Cordova。
需要明確的是,筆記本計算機和臺式計算機應該會在未來很多年裡繼續存在。但是,由於行動裝置的流量早已超過臺式計算機,所以可以肯定地說,學會 Python 並不足以成為經驗豐富的全能開發人員。
運行時錯誤
Python 腳本不是先編譯後執行的。相反,它會在每次執行時編譯,因此,任何編碼錯誤都會在運行時顯示出來。這會導致性能差、耗時長,並且需要進行大量測試。比如,很多很多測試。
這特別適合初學者,因為測試可以教會他們很多東西。但是對於經驗豐富的開發人員來說,必須用 Python 調試複雜的程序會讓他們出錯。這種性能的缺乏是在 Python 上設置時間戳的最大因素。
未來何時,誰將取代 Python?
在程式語言市場上有幾個新的競爭對手:
Rust 提供了與 Python 同樣的安全性,任何變量不會被意外覆蓋。但是,它用所有權(ownership)和借用(borrowing)解決了性能問題。根據 Stack Overflow Insights 的統計,Rust 也是過去幾年來最受歡迎的程式語言。Go 對於 Python 這樣的初學者來說很棒。它是如此簡單,以至於維護代碼更加容易了。有趣的是:Go 開發人員是市場上收入最高的程式設計師之一。Julia 是一門非常新的程式語言,可以與 Python 一較高下。它填補了大規模技術計算的空白:通常情況下,人們會使用 Python 或 Matlab,然後用 C++ 庫來修補整個程序,這在大規模應用時是必需的。現在,人們可以使用 Julia,而不是同時使用兩種程式語言。雖然市場上還有其他程式語言,Rust、Go 和 Julia 是修補了 Python 薄弱部分的程式語言。所有這些語言在未來的技術上表現出色,尤其是在人工智慧領域。雖然它們的市場份額仍然很小,但從 Stack Overflow 標籤的數量可以看出,它們的趨勢都很明顯:上升。
StackOverflow 上各種程式語言標籤快照。
鑑於目前 Python 已無處不在的流行程度,這些新語言中的任何一門要想取代它,肯定要花上五年的時間,甚至終其「一生」。
究竟會是哪一門程式語言將取代 Python,是 Rust?Go?Julia?抑或是未來的一門新語言?現在還很難說。但是鑑於 Python 架構中的最基本的性能問題,這些語言中的一門將會不可避免地佔據一席之地。
關注我並轉發此篇文章,私信我「領取資料」,即可免費獲得InfoQ價值4999元迷你書!