Python這么火,為什么說它不是未來的編程語言?
本文轉載自公眾號“讀芯術”(ID:AI_Discovery)
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”,而且這種趨勢越來越明顯。以下是出現這種情況的幾個原因:
1. 出現時間早
Python大約誕生于90年代。這不僅意味著它有足夠的時間成長,還獲得了一個龐大的粉絲群體。
所以如果人們在用Python編碼時遇到了問題,那么很可能只需用谷歌搜索一下便能解決。這不過是有些人已經遇到了相同的問題,寫了一些有助于解決問題的內容而已。
2. 適合初學者
Python已經存在了數十年,程序員們可利用這段時間寫出優質的教程。除此之外,Python的語法也很容易理解。
首先,無需指定數據類型。指定變量即可;Python會根據語境判斷它是整數、浮點值、布爾值還是其他值。對于初學者來說,這是一個很大的優勢。如果是C++語言,那么用浮點值替換整數時,程序將不會進行編譯,曾經使用該語言編程的初學者應該對這種情況帶來的挫敗感深有體會。
如果初學者曾經并行閱讀過Python和C++代碼,那么會明白Python是多么容易理解。
即使C++語言在設計時考慮到了英語,但是和Python代碼相比,它還是難以看懂。
3. 用途廣泛
Python已經存在了相當長的時間,開發人員們根據不同目的制作出了不同的程序包。現在,幾乎所有的東西都能打包。
想處理數字、向量和矩陣?Numpy是個好幫手。
想對技術和工程進行計算?用Scipy。
想在數據處理和分析領域大展身手?試試Pandas。
想從人工智能入手?為什么不用Scikit-Learn。
無論人們要管理什么樣的計算任務,都有可能用到Python程序包。從機器學習在過去幾年間的迅猛發展便可看出,自身用途的廣泛讓Python處于近期發展的前列。
Python的缺點——以及它們是否致命
根據先前的論述,可以想象Python會在很長一段時間之內保持發展的迅猛勢頭。但和其他技術一樣,Python也有自己的弱點。筆者將一一介紹其最值得關注的缺點,并分析這些缺點是否致命。
1. 速度
Python的速度很慢。真的很慢。和其他語言相比,Python需要花2-10倍的時間來完成任務。
速度慢有多種原因。其中一個原因是Python屬于動態類型——請記住,無需像其他語言一樣指定數據類型。這意味著需要占用大量內存,因為程序需要為那些可在任何情況下運行的變量保留足夠的空間。大量的內存占用轉化為大量的計算時間。
另一個原因是Python一次只能執行一個任務。靈活的數據集會出現這樣的結果——Python需要確保每個變量只有一個數據類型,平行進程可能會造成混亂。
相比之下,普通的網絡瀏覽器一次可以運行十二個不同的線程。還有一些其他的理論。
但歸根結底,所有的速度問題都無關緊要。電腦和服務器的價格十分便宜,所以人們討論的只是關于幾分之一秒的運行速度。而且終端用戶并不在意自己是用0.001秒還是0.01秒加載應用程序。
2. 范圍
起初,Python使用動態作用域。這基本上意味著,為了評估表達式,編譯系統首先要搜索當前塊,然后依次搜索所有調用函數。
動態作用域方面的問題在于,每個表達式都需要在每個可能的語境中進行測試——這相當繁瑣。這就是大多數現代編程語言都使用靜態作用域的原因。
Python曾試圖過渡到靜態作用域,但卻造成了混亂。通常情況下,內部作用域——比如函數中的函數——將能夠查看并更改外部作用域。但Python中的內部作用域只能查看外部作用域,卻不能對其進行更改。這會導致嚴重的混亂。
3. Lambdas
盡管Python具有很高的靈活性,但Lambdas的使用還是有一定的局限性。在Python中,Lambdas只能是表達式,而不能是語句。
另一方面,變量聲明和語句始終是語句。這意味著Lambdas不能為它們所用。
表達式和語句之間的區別相當隨意,而其他語言并沒有這樣的情況。
空格讓代碼更容易看懂,但也讓其更難以
4. 空格
Python使用空格和縮進來表示不同級別的代碼。這使得代碼在視覺上更具有吸引力,能夠直觀理解。
其他語言,比如C++語言,更多使用的是大括號和分號。雖然在視覺上沒有什么吸引力,對初學者也并不友好,但這樣做讓代碼更易于維護。對于較大的項目來說,這大有幫助。
Haskell這樣較新的語言解決了這個問題:該語言多使用空格,但又為那些不想使用空格的人提供了另一種語法。
5. 移動開發
人們見證了從臺式機到智能手機的轉變,很明顯,人們需要強大的語言來構建移動軟件。
但正在使用Python進行開發的移動應用軟件并不多。這并不意味著用Python進行移動開發無法實現——名為Kivy的Python程序包就可以做到移動開發。
但Python并沒有考慮到移動設備。所以即使它有可能完成一些基本任務,也最好使用為移動應用程序開發而創建的語言。廣泛使用的移動編程框架包括React Native、Flutter、Iconic和Cordova。
需要明確的是,在未來的很多年,筆記本和臺式機應該都會繼續存在。但是,移動設備在通信量方面已遠遠超越了桌面設備,因此可以肯定地說,想要成為經驗豐富的全能型開發人員,只學習Python是不夠的。
6. 運行錯誤
Python腳本并不是遵循先編譯后執行的流程。相反,它在每次執行時進行編譯,所以任何編碼錯誤在運行時都會顯現出來。這會導致性能下降、浪費時間以及需要進行大量測試。真的是大量的測試。
對于初學者來說,這是一件好事,因為他們可以從測試中學到很多。但對于經驗豐富的開發人員來說,對Python中的復雜程序進行調試會讓他們感到無所適從。性能不佳是在Python上設置時戳的最大原因。
什么會在未來取代Python——具體是什么時候
編程語言市場上出現了幾個新的競爭者:
- Rust具備與Python相同的安全性——不會意外覆蓋任何變量。但它通過所有權和借用的概念解決了性能問題。Stack OverflowInsights顯示,它還是過去幾年當中最受人們喜愛的編程語言。
- Go非常適合初學者,就像Python一樣。它是如此簡單,甚至連維護代碼都變得更加容易。有趣的一點是:Go開發人員是市場上收入最高的程序員之一。
- Julia是一種非常新的語言,可與Python展開正面競爭。它填補了大規模技術計算的空白:以前,人們通常會使用Python或Matlab,并使用C++庫對整個程序進行修補,這一過程在大規模技術計算中是必需的。現在,人們可以使用Julia,而不必費力使用兩種語言。
雖然市面上還有其他的語言,但Rust、Go和Julia卻是彌補了Python弱項的語言。所有這些語言都在尚未投入使用的技術中表現出色,在人工智能領域的表現尤其亮眼。Stack Overflow標簽的數量顯示,這些語言的市場份額仍然很小,盡管如此,它們未來的上升趨勢卻顯而易見。
Stack Overflow上各種編程語言的標簽快
目前,Python十分流行,可以說是無處不在,新語言要想取代它,肯定需要五年(甚至可能是十年)的時間。
這個時候,很難說會是哪種語言取代Python(Rust、Go、Julia還是未來的某種新語言)。但考慮到Python體系結構中最基本的性能問題,一定會有某種語言取代它的位置。
你覺得呢?