人生苦短,Python會不會被取代?國外網(wǎng)友吵翻天
本文經(jīng)AI新媒體量子位(公眾號ID:QbitAI)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載請聯(lián)系出處。
人生苦短,我該不該選擇Python?
編程語言幾年一變樣,榜單之爭也是愈演愈烈,還架不住時不時殺出個黑馬……
而對于Python,自2010年初以來一直蓬勃發(fā)展至今,在流行程度上,也超越了C、C++、Java等老牌編程語言。

那么問題來了:
這種趨勢將持續(xù)到什么時候?最終會因何故被其他語言取代?
對于Python是不是the language of the future,網(wǎng)友們展開就此展開一番激辯。
反方:必然會有一種語言取代Python
一位名叫Rhea Moutafis的網(wǎng)友認(rèn)為,Python不會是“未來的編程語言”。觀點僅發(fā)布數(shù)日,便得到了10.2k的點贊。
他從“流行原因”、“缺點”以及“何時、何故被取代”三方面做了闡述。

Python為何現(xiàn)在如此流行?
Moutafis認(rèn)為,Python的成功,一定程度體現(xiàn)在Stack Overflow的趨勢上。這個平臺衡量了發(fā)布帖子中的標(biāo)簽數(shù)量,再考慮到它的規(guī)模,對于“受歡迎編程語言”來說是個不錯的指標(biāo)。

從圖中可以看出,R語言在過去幾年中處于穩(wěn)步增長的狀態(tài),但其他語言,像C#、C++、Java和JavaScript,都有下降的趨勢。
而在所有Stack Overflow的問題中,幾乎有14%的問題被貼上了 “Python “的標(biāo)簽,而且這個趨勢還在上升。
Moutafis認(rèn)為,原因有如下3個方面。
首先,Python也算是一個老牌語言。
Python從90年代便已出現(xiàn),這不僅意味著它有足夠的時間來發(fā)展,還意味著擁有一個龐大而強(qiáng)有力的社區(qū)支持。
所以你在用Python編程的時候,如果遇到了任何問題,只要網(wǎng)上搜索一下,大概率就能解決掉。
因為很有可能在你之前,就有人遇到過同樣的問題,還在網(wǎng)上留下了寶貴的意見。
其次,Python對于初學(xué)者來說是友好的。
對于這一點,并不是說它存在了幾十年,給了程序員們充足的時間來寫使用教程。而是Python的語法易讀性特別好。
例如你不需要指定數(shù)據(jù)類型,只要聲明一個變量,Python會根據(jù)上下文,理解這個變量是屬于整數(shù)、浮點數(shù)、布爾值等等。
這對于初學(xué)者來說優(yōu)勢是巨大的。如果你用過C++,你就有可能體會到這樣的痛苦:程序跑不出來,可能僅僅是因為把一個浮點數(shù)指定成了整數(shù)……
以及,如果對比著讀過Python和C++的代碼,你就能深刻的體會到Python代碼理解起來是有多么容易。
最后,Python的用于很廣。
Python從出現(xiàn)至今,開發(fā)人員幾乎在各個領(lǐng)域、用途方面開發(fā)了包(package):
- 想處理數(shù)字、向量和矩陣?Numpy是的你首選。
- 想進(jìn)行技術(shù)和工程方面的計算?SciPy了解一下。
- 想在數(shù)據(jù)處理和分析領(lǐng)域大展身手?Pandas值得一試。
- 想涉足人工智能?Scikit-Learn真香(褒義……)。
無論你想處理哪種計算任務(wù),Python幾乎都可以提供相應(yīng)的包。從近幾年機(jī)器學(xué)習(xí)的激增,也不難看出Python一直處于發(fā)展的前沿。
Python的缺點是否具有致命性?
當(dāng)然,沒有一個技術(shù)是完美的,Python也不例外。Moutafis列出了6個最重要的缺陷,還評估了它們是否具有致命性。
第一,速度 (Speed)。
平均來說,用Python運行一個任務(wù)所需要的時間,是其他語言的2-10倍。
為什么會這樣呢?其中一個原因就是它是動態(tài)類型。
就像剛才說的,你不需要指定數(shù)據(jù)類型,這就意味著它需要使用大量的內(nèi)存,因為程序需要為每個變量預(yù)留足夠的空間,確保在任何情況下都能工作。而大量的內(nèi)存使用量,意味著大量的計算時間。
另一個原因是Python一次只能執(zhí)行一個任務(wù)。這是靈活數(shù)據(jù)類型的結(jié)果——Python需要確保每個變量只有一個數(shù)據(jù)類型,而并行進(jìn)程可能會把這一點搞得一團(tuán)糟。
相比之下,一般的Web瀏覽器一次可以運行12個不同的線程……
但說到底,這些速度問題都無關(guān)緊要。計算機(jī)和服務(wù)器現(xiàn)在很便宜了,用戶并不真正關(guān)心他們的應(yīng)用程序,是否在0.001或0.01秒內(nèi)能加載完。
第二,作用域 (Scope)。
最初,Python是動態(tài)確定作用域的。這基本上就意味著,要對表達(dá)式求值,編譯器首先需要搜索當(dāng)前塊,然后依次搜索所有調(diào)用函數(shù)。
動態(tài)作用域的問題在于,每個表達(dá)式都需要在每個可能的上下文中進(jìn)行測試。這個是相當(dāng)繁瑣的過程,這也就是為什么大多數(shù)現(xiàn)代編程語言使用靜態(tài)作用域的原因。
對于這個問題,Python試圖過渡到靜態(tài)作用域,但卻搞砸了:通常,內(nèi)部作用域能夠查看和更改外部作用域,但在Python中,內(nèi)部作用域只能看到外部作用域,而不能更改它們。
第三,Lambda。
盡管Python內(nèi)部的靈活性很好,但Lambda的使用還是相當(dāng)有限制的。Lambda只能是Python中的表達(dá)式,而不能是語句。
另外,變量聲明和語句始終是語句,這意味著Lambda不能用于它們。
表達(dá)式和語句之間的這種區(qū)別,可以說是相當(dāng)隨意,在其他語言中就不會出現(xiàn)這種情況。
第四,空白符 (Whitespaces)。
在Python中,你可以用空格和縮進(jìn)來表示不同級別的代碼。這讓它在視覺上很吸引人,也很容易理解

而其他語言,例如C++,更多的是依賴大括號和分號。雖然這可能并不吸引人,也不適合初學(xué)者,但它讓代碼的可維護(hù)性提高了很多。對于較大的項目來說,這就更有用了。
像Haskell這樣的新語言就解決了這個問題:它們依賴于空格,但同時為那些希望不使用空格的人,提供了一種替代語法。
第五,移動開發(fā) (Mobile Development)。
隨著應(yīng)用逐步從電腦桌面轉(zhuǎn)向移動端,很明顯我們需要強(qiáng)大的語言來構(gòu)建移動軟件。但用Python開發(fā)的移動應(yīng)用并不多。
Python并不是為移動端開發(fā)而設(shè)計的,即便在基本任務(wù)上能達(dá)到差強(qiáng)人意的效果,但最好還是選擇專門為移動端開發(fā)的語言,例如React Native、Flutter、Iconic和Cordova。
需要明確的是,筆記本和臺式電腦仍會在未來存在一段時間。但由于移動端流量早已超過了桌面端,可以說,學(xué)習(xí)Python還不足以讓你成為一個全能型開發(fā)者。
第六,Runtime Error。
一個 Python 腳本不是先編譯,然后再執(zhí)行。相反,它在每次執(zhí)行時都會編譯,所以任何編碼錯誤都會在運行時顯示出來。這導(dǎo)致性能差、時間消耗大,以及需要大量的測試
這對初學(xué)者來說是很好的,因為測試可以教給他們很多東西。但對于經(jīng)驗豐富的開發(fā)人員來說,不見得這是個好事。
在未來,何時、何故會讓Python被取代
在編程語言這個市場上,出現(xiàn)了一批新的競爭者:
- Rust提供了和Python一樣的安全性——沒有任何變量會被意外覆蓋。但它用ownership和borrowing的概念解決了性能問題。根據(jù)StackOverflow Insights的數(shù)據(jù),它也是過去幾年來最受歡迎的編程語言之一。
- Go對于Python初學(xué)者來說也是非常棒的一門語言。它非常簡單,甚至代碼維護(hù)起來更容易。有意思的一點是,Go開發(fā)者是市場上收入最高的程序員之一。
- Julia是一門非常新的語言,可以與Python一較高下,它填補了大規(guī)模技術(shù)計算的空白。在大規(guī)模計算中,人們通常會使用Python或Matlab,然后用C++庫進(jìn)行修補。現(xiàn)在,只用Julia就可以了,不用再在兩種語言之間來回切換。
雖然市場上有其他語言,但Rust、Go和Julia是修復(fù)Python弱點的語言。
所有這些語言都擅長于未來的技術(shù),尤其是人工智能。雖然它們的市場份額仍然很小,但從StackOverflow標(biāo)簽的數(shù)量可以看出,它們上升的趨勢都很明顯。

考慮到目前Python的普遍流行,這些新語言要想取代它,肯定要花上五年,甚至整整十年的時間。
那么,取代Python的將是哪一種語言?Rust、Go、Julia,還是未來的新語言?
目前還很難說,但考慮到Python架構(gòu)中的性能問題,必然會有一種語言取代它的位置。
正方:你的觀點漏洞百出
反方一辯陳述完畢,接下來,是正方的觀點。
用戶miraculixx針對Moutafis的文章,發(fā)起了猛烈攻擊,也獲得了高度關(guān)注——2.1K的贊。

miraculixx直接開門見山:
這篇文章有夠爛的。你喜歡Rust、Go和Julia?那就去寫它們好了,不要來抨擊Python。
而后,直接提出了七大錯誤之處。
Python并不慢
首先,速度有兩個組成部分。
其一,你寫出想要的程序有多快,這是客戶和大多數(shù)開發(fā)人員真正關(guān)心的。Python對于一個命令行語言來說,它的速度是非常快的,大多數(shù)其他語言所需要的時間要長得多。
其二,是執(zhí)行速度。正如你所指出的,在很多情況下,這幾乎不重要,但當(dāng)它有需要的時候,Python既有內(nèi)置的工具來加速,也有廣泛的工具生態(tài)系統(tǒng)來實現(xiàn)native速度 (與編譯后的 C 代碼相同)。
Python確實可以并行運行多個任務(wù)
與大多數(shù)其他語言不同,Python代碼非常容易并行運行,甚至可以跨大型節(jié)點集群運行,這對于云計算來說非常好。
內(nèi)置的多模塊處理,可以在本地和遠(yuǎn)程節(jié)點上運行。還有其他工具,如Celery、IParallel、Dask等,讓并行運行代碼變得輕而易舉。
縮進(jìn),作為代碼塊的分隔符,對任何項目來說都是一種優(yōu)勢
因為這樣就能確保代碼看起來與個人偏好無關(guān),意味著更好的可讀性,這通常會增加可維護(hù)性。
無論你有1個還是100個開發(fā)者,Python都很好用
大多數(shù)項目都只有1-5個開發(fā)者,而且,Python的模塊化方法使得重構(gòu)代碼變得非常容易。
模塊化是構(gòu)建大型可維護(hù)軟件產(chǎn)品的關(guān)鍵成功因素。
靜態(tài)類型不是可擴(kuò)展團(tuán)隊的關(guān)鍵因素
根據(jù)我的經(jīng)驗,靜態(tài)類型的影響如果不損害協(xié)作能力的話,也是可以忽略的。
團(tuán)隊實際開發(fā)過程中的細(xì)節(jié)情況,超過出了你寫的評論,一言以蔽之:靜態(tài)類型很難做到處處都是對的,當(dāng)出現(xiàn)問題的時候,還是需要更多人加入到團(tuán)隊來解決。
團(tuán)隊規(guī)模越大,溝通成本就越高,以n2的速度增長。也就是說,靜態(tài)類型實際上限制了生產(chǎn)力,而且我敢說這樣做并沒有提高質(zhì)量。
Python并不老
Python最新版本是在2019年第四季度發(fā)布的。無論是語言還是它所支持的用例,都不能說是“老”。
你說它不能在瀏覽器中運行不僅是錯誤的,而且也沒有抓住重點。大多數(shù)語言都不能在瀏覽器中運行,因為Web語言是JavaScript。不管你喜不喜歡,事情就是這樣。
React、Flutter等都不是編程語言
把不該比較的東西混為一談,對你文章的可信度并沒有什么好處。
......
那么,你覺得Python未來的命運會是什么樣呢?