Python經(jīng)過(guò)了幾十年的努力才得到了編程社區(qū)的賞識(shí)。自2010年以來(lái),Python得到了蓬勃發(fā)展,并終超越了C、C#、Java和Javascript。
但是,這種趨勢(shì)將持續(xù)到什么時(shí)候?何時(shí)Python會(huì)被其他語(yǔ)言取代?被取代的原因又是什么呢?
對(duì)于Python被淘汰出局的確切日期有很多猜測(cè),它可能會(huì)像科幻小說(shuō)一樣成為過(guò)去。在本文中,我將討論促成Python大面積普及的優(yōu)勢(shì),以及將來(lái)導(dǎo)致它隕落的弱點(diǎn)。
促成Python流行的因素
通過(guò)Stack
Overflow發(fā)展趨勢(shì)就可以洞悉Python的成功??紤]到StackOverflow的規(guī)模,我們可以認(rèn)為這是衡量編程語(yǔ)言流行度的一個(gè)很好的指標(biāo)。
盡管在過(guò)去幾年中,R語(yǔ)言的發(fā)展一直處于平穩(wěn)狀態(tài),很多其他編程語(yǔ)言已開(kāi)始穩(wěn)步下降,但Python的增長(zhǎng)似乎勢(shì)不可擋。在所有StackOverflow的問(wèn)題中,帶有“python”標(biāo)簽的占到了14%,而且這種趨勢(shì)還在上升。其中的原因有很多。
Python是一種古老的語(yǔ)言
Python于90年代問(wèn)世。這不僅意味著Python有足夠的時(shí)間成長(zhǎng),而且還擁有了一個(gè)龐大的支持社區(qū)。
因此,如果你在使用Python進(jìn)行編程時(shí)遇到任何問(wèn)題,只需上網(wǎng)搜索就可以得到答案。因?yàn)榭偸菚?huì)有人在這之前就遇到了這個(gè)問(wèn)題,并為此撰寫(xiě)了一些有用的資料。
對(duì)初學(xué)者很友好
Python對(duì)初學(xué)者友好的原因不僅僅是因?yàn)樗呀?jīng)存在了數(shù)十年,予以程序員足夠的時(shí)間編寫(xiě)出色的教程,而且還因?yàn)镻ython的語(yǔ)法非常易于理解。
首先,無(wú)需指定數(shù)據(jù)類型。你只需聲明一個(gè)變量即可,Python會(huì)根據(jù)上下文判斷這個(gè)變量是整數(shù)、浮點(diǎn)數(shù)、布爾值還是其他類型。對(duì)于初學(xué)者來(lái)說(shuō),這是一個(gè)巨大的優(yōu)勢(shì)。如果你有過(guò)使用C++編程的經(jīng)歷,那么就會(huì)懂得只因?yàn)槟沐e(cuò)把浮點(diǎn)數(shù)定義成了整數(shù),就導(dǎo)致程序無(wú)法通過(guò)編譯有多么難受了。
此外,比較Python和C++代碼,不難發(fā)現(xiàn)Python有多么易于理解。盡管C++在設(shè)計(jì)時(shí)考慮到了英語(yǔ),但與Python代碼相比,閱讀C++的代碼還是相當(dāng)坎坷。
用途廣泛
由于Python已經(jīng)存在了很長(zhǎng)時(shí)間,因此開(kāi)發(fā)人員為之開(kāi)發(fā)出了各色的軟件包。如今,無(wú)論遇到什么問(wèn)題,你都可以找到相關(guān)的軟件包。
想處理數(shù)字、向量和矩陣?那么就來(lái)試試 NumPy 吧。
想進(jìn)行技術(shù)和工程的計(jì)算?那么就來(lái)試試 SciPy 吧。
想操作和分析大數(shù)據(jù)?那么就來(lái)試試 Pandas 吧。
想學(xué)習(xí)人工智能?為什么不試試 Scikit-Learn 呢。
無(wú)論你需要進(jìn)行哪方面的計(jì)算任務(wù),都可以找到相關(guān)的Python軟件包。由于過(guò)去幾年中機(jī)器學(xué)習(xí)的迅猛發(fā)展,Python已經(jīng)站在了時(shí)代發(fā)展的前沿。
Python的缺點(diǎn),這些缺點(diǎn)是否致命?
通過(guò)上述討論,你可以想象在很長(zhǎng)一段時(shí)間內(nèi)Python的發(fā)展都勢(shì)不可擋。然而,Python也逃不開(kāi)一切技術(shù)的命運(yùn),它也有自己的弱點(diǎn)。接下來(lái),我將逐個(gè)介紹Python的重大缺陷,并評(píng)估這些缺陷是否致命。
速度
Python很慢,非常非常慢。平均而言,使用Python完成某個(gè)任務(wù)所需的時(shí)間是使用任何其他語(yǔ)言的2–10倍。
其中的原因有很多。其中之一是因?yàn)镻ython是動(dòng)態(tài)類型的,別忘了你不需要像其他語(yǔ)言一樣指定數(shù)據(jù)類型。這意味著內(nèi)存的耗費(fèi)非常大,因?yàn)樵谌魏吻闆r下程序都需要為每個(gè)變量保留足夠的空間。而巨大的內(nèi)存使用量必然需要耗費(fèi)大量的計(jì)算時(shí)間。
另一個(gè)原因是Python一次只能執(zhí)行一個(gè)任務(wù)。這是靈活的數(shù)據(jù)類型帶來(lái)的結(jié)果,Python需要確保每個(gè)變量只有一個(gè)數(shù)據(jù)類型,而并行進(jìn)程可能會(huì)在這一點(diǎn)上出問(wèn)題。
相比之下,普通的Web瀏覽器一次可以運(yùn)行十幾個(gè)不同的線程。當(dāng)然其中還涉及別的因素。但終所有的速度問(wèn)題都不打緊。因?yàn)殡娔X和服務(wù)器的價(jià)格越來(lái)越低,我們談?wù)摰囊仓徊贿^(guò)是幾分之一秒的問(wèn)題。終用戶并不真正在乎他們的應(yīng)用加載需要0.001還是0.01秒。
范圍
初,Python是動(dòng)態(tài)作用域。這基本上意味著,為了評(píng)估表達(dá)式,編譯器首先需要搜索當(dāng)前塊,然后依次搜索所有調(diào)用函數(shù)。
動(dòng)態(tài)作用域的問(wèn)題在于,每個(gè)表達(dá)式都需要在所有上下文中進(jìn)行測(cè)試,這很繁瑣。這就是為什么大多數(shù)現(xiàn)代編程語(yǔ)言都使用靜態(tài)作用域。
Python曾嘗試過(guò)渡到靜態(tài)作用域,但搞砸了。通常,內(nèi)部作用域(例如函數(shù)中的函數(shù))能夠查看和更改外部作用域。在Python中,內(nèi)部作用域只能看到外部作用域,但不能更改。因此引發(fā)了很多混亂。
Lambdas
盡管Python非常靈活,但Lambdas的使用還是有一定的局限性。Lambda只能是Python中的表達(dá)式,而不能是語(yǔ)句。
另一方面,變量聲明和語(yǔ)句始終是語(yǔ)句,這意味著它們不能使用Lambda。在Python中,表達(dá)式和語(yǔ)句之間的區(qū)別相當(dāng)隨意,這是其他編程語(yǔ)言都沒(méi)有的問(wèn)題。
空白
在Python中,你需要使用空白和縮進(jìn)來(lái)表示不同級(jí)別的代碼。這種格式具有視覺(jué)吸引力,而且易于理解。
其他編程語(yǔ)言(例如C++)都需要依賴大括號(hào)和分號(hào)。盡管這可能在視覺(jué)上沒(méi)有那么強(qiáng)的吸引力,而且對(duì)初學(xué)者不夠友好,但可以提高代碼的可維護(hù)性。在大型項(xiàng)目中,這種方式更為妥當(dāng)。
Haskell等新興的編程語(yǔ)言解決了這個(gè)問(wèn)題:它們依賴空白,但同時(shí)也為那些希望不用空白的人提供了另一種語(yǔ)法。
移動(dòng)開(kāi)發(fā)
我們目睹了從臺(tái)式機(jī)向智能手機(jī)的轉(zhuǎn)變,很明顯,我們需要強(qiáng)大的語(yǔ)言來(lái)構(gòu)建移動(dòng)軟件。
然而,使用Python開(kāi)發(fā)的移動(dòng)應(yīng)用并不多。這并不意味著Python無(wú)法開(kāi)發(fā)移動(dòng)應(yīng)用,你可以試試看一個(gè)名為 Kivy 的 Python 包。
但是,Python的設(shè)計(jì)被沒(méi)有考慮到移動(dòng)設(shè)備。因此,即使Python可以應(yīng)付基本的任務(wù),但我們還是選擇專門(mén)為移動(dòng)應(yīng)用程序開(kāi)發(fā)而創(chuàng)建的語(yǔ)言。廣泛用于移動(dòng)編程的語(yǔ)言包括:React
Native、Flutter、Iconic和Cordova。
我們需要明確的是,筆記本電腦和臺(tái)式計(jì)算機(jī)已經(jīng)存在很多年了。然而,由于移動(dòng)設(shè)備的使用已然超越了桌面設(shè)備,因此我們肯定地說(shuō),學(xué)習(xí)Python不足以成為經(jīng)驗(yàn)豐富的全方面開(kāi)發(fā)人員。
運(yùn)行時(shí)錯(cuò)誤
Python不需要首先編譯,然后再執(zhí)行。相反,它會(huì)在每次執(zhí)行時(shí)編譯,因此所有編程上的錯(cuò)誤都會(huì)在運(yùn)行時(shí)顯示出來(lái)。這會(huì)導(dǎo)致性能下降、浪費(fèi)時(shí)間,而且還需要進(jìn)行大量測(cè)試。
對(duì)于初學(xué)者來(lái)說(shuō),這未必是壞事,因?yàn)闇y(cè)試可以教會(huì)他們很多知識(shí)。然而,對(duì)于經(jīng)驗(yàn)豐富的開(kāi)發(fā)人員而言,必須使用Python調(diào)試復(fù)雜的程序很令人頭疼。性能欠缺是Python的問(wèn)題。
Python什么時(shí)候會(huì)被取代?
如今,編程語(yǔ)言市場(chǎng)上涌現(xiàn)了新的競(jìng)爭(zhēng)力量:Rust提供了與Python相同的安全性——不會(huì)意外覆蓋任何變量。但是,它通過(guò)所有權(quán)和借用的概念解決了效率的問(wèn)題。根據(jù)StackOverflow
Insights,Rust是近幾年的編程語(yǔ)言。
Go 與 Python 一樣非常適合初學(xué)者。語(yǔ)言本身非常簡(jiǎn)單,維護(hù)代碼更加簡(jiǎn)單。此外,有趣的是,Go開(kāi)發(fā)人員是市場(chǎng)上收入的程序員之一。
Julia是一種非常新的語(yǔ)言,可與Python正面競(jìng)爭(zhēng)。Julia填補(bǔ)了大規(guī)模技術(shù)計(jì)算的空白:以前,人們通常都需要使用Python或Matlab編寫(xiě)代碼,然后再使用C++庫(kù)修補(bǔ)整個(gè)程序,因?yàn)镃++庫(kù)是大規(guī)模必不可少的。如今,人們可以使用Julia,而不必在兩種語(yǔ)言之間掙扎。
盡管市場(chǎng)上還有其他語(yǔ)言,但Rust、Go和Julia
可以彌補(bǔ)Python的弱點(diǎn)。所有這些語(yǔ)言在即將到來(lái)的技術(shù)中都有出色的表現(xiàn),典型的就是人工智能。盡管它們的市場(chǎng)份額仍較小,但根據(jù)StackOverflow的數(shù)據(jù)顯示,這些語(yǔ)言的發(fā)展呈現(xiàn)出明顯的上升趨勢(shì)。
如今,Python無(wú)處不在,我們還需要五年甚至更長(zhǎng)的時(shí)間,才有可能看到Python被新語(yǔ)言所替代。
因此,Python在短期看來(lái),依舊具有不可替代性。想要學(xué)Python的你,此時(shí)進(jìn)場(chǎng)依舊是好時(shí)機(jī)。達(dá)內(nèi)Python語(yǔ)言培訓(xùn)班,助你快速成為一名合格Python全棧工程師。