Python即將出局?Julia和Swift能取而代之嗎?
上世紀(jì)90年代,Python作為一種通用編程語(yǔ)言誕生了。盡管語(yǔ)句簡(jiǎn)潔,Python在最初十年的使用情況卻并不樂(lè)觀,它也沒(méi)能真正成為開(kāi)發(fā)者使用的編程語(yǔ)言。當(dāng)時(shí),Perl是編程首選,Java已在面向?qū)ο缶幊填I(lǐng)域站穩(wěn)腳跟。
當(dāng)然,一切編程語(yǔ)言都需要一定的成熟時(shí)間,只有它比現(xiàn)有工具更適合編程,才會(huì)被廣泛使用。Python在21世紀(jì)初期的第一個(gè)機(jī)遇就是,人們意識(shí)到Python的學(xué)習(xí)曲線比Perl簡(jiǎn)單,還能與其他語(yǔ)言互相操作。這種特性讓大量開(kāi)發(fā)者使用Python編程。Django的出現(xiàn)終結(jié)了Perl, Python勢(shì)頭更猛了,但仍然無(wú)法與其“后輩”Java和JavaScript相提并論。
快進(jìn)到現(xiàn)在,2019年StackOverflow開(kāi)發(fā)者年度調(diào)查報(bào)告顯示,Python已超越Java成為第二受歡迎的語(yǔ)言。
Python還是10年來(lái)發(fā)展速度最快的編程語(yǔ)言。Python的普及很大程度上得益于2010年大數(shù)據(jù)的出現(xiàn)及機(jī)器學(xué)習(xí)、人工智能的發(fā)展。企業(yè)迫切需要發(fā)展迅速、門(mén)檻低的編程語(yǔ)言以管理大規(guī)模數(shù)據(jù)和科學(xué)計(jì)算任務(wù),而Python能完美解決這些問(wèn)題。
除了以上優(yōu)勢(shì),Python還是一種動(dòng)態(tài)類(lèi)型的解釋型語(yǔ)言。更重要的是,它得到了Google的支持,后者為T(mén)ensorflow購(gòu)買(mǎi)了Python,這使其成為數(shù)據(jù)分析、可視化和機(jī)器學(xué)習(xí)的首選語(yǔ)言。
然而,盡管對(duì)機(jī)器學(xué)習(xí)和人工智能的需求在新十年也將不斷增加,但Python的好景卻不長(zhǎng)了。如同其它編程語(yǔ)言一般,Python本身也有缺陷。這些缺陷讓它能輕易被其它更適合完成企業(yè)常規(guī)任務(wù)的語(yǔ)言所取代。哪怕有R語(yǔ)言坐鎮(zhèn),Swift、Julia和Rust等新編程語(yǔ)言的出現(xiàn)也對(duì)數(shù)據(jù)科學(xué)的現(xiàn)任王者構(gòu)成了極大威脅。
Rust仍在努力適配機(jī)器學(xué)習(xí),所以我認(rèn)為Swift和Julia是取代Python并最終統(tǒng)治數(shù)據(jù)科學(xué)的語(yǔ)言。一起來(lái)看看Python面臨的困境吧。
Python缺乏類(lèi)型安全性,運(yùn)行速度非常慢
圖源:unsplash
所有的好事都要付出代價(jià),Python的動(dòng)態(tài)類(lèi)型化也不例外。動(dòng)態(tài)類(lèi)型可以輕松快速地編寫(xiě)代碼而無(wú)需定義類(lèi)型。然而,尤其是當(dāng)代碼庫(kù)變大時(shí),代碼運(yùn)行更容易出問(wèn)題,開(kāi)發(fā)人員在生產(chǎn)環(huán)境中運(yùn)行代碼時(shí)會(huì)更艱難。編譯器很容易發(fā)現(xiàn)的 BUG,在Python中反而無(wú)法識(shí)別,這樣就會(huì)產(chǎn)生開(kāi)發(fā)障礙,最終降低大規(guī)模應(yīng)用程序的開(kāi)發(fā)速度。
更糟糕的是,不同于編譯代碼,Python的解釋程序每次執(zhí)行時(shí)都要分析每行代碼。相比于其它語(yǔ)言,Python開(kāi)銷(xiāo)更大,程序性能低得多。
而Julia能避免上述問(wèn)題。Julia雖是動(dòng)態(tài)類(lèi)型語(yǔ)言,但是它有實(shí)時(shí)編譯器。其JIF編譯器要么就是在執(zhí)行前生成正確的機(jī)器代碼,要么就是使用先前已儲(chǔ)存、緩存的編譯,這讓它擁有與靜態(tài)類(lèi)型語(yǔ)言一樣的性能。
更重要的是,Julia有一個(gè)稱(chēng)為多分派的關(guān)鍵特性,類(lèi)似于OOPs的函數(shù)重載(雖然僅能用于運(yùn)行程序)。多分派的強(qiáng)大之處在于它能夠處理不同的參數(shù)類(lèi)型,而無(wú)需創(chuàng)建單獨(dú)的函數(shù)名或嵌套的if語(yǔ)句。這有助于編寫(xiě)更加緊湊的代碼,也是數(shù)值計(jì)算的一大勝利,它可以輕松地通過(guò)擴(kuò)展解決方案來(lái)處理所有類(lèi)型的參數(shù)。
Swift甚至更勝一籌。Swift是靜態(tài)類(lèi)型語(yǔ)言,LLVM編譯器(低級(jí)虛擬機(jī)器)對(duì)其進(jìn)行了高度優(yōu)化。它能快速編譯成匯編代碼,這讓Swift超高效運(yùn)行,速度可比擬C語(yǔ)言。
此外,Swift擁有更好的內(nèi)存安全和管理工具,即自動(dòng)引用計(jì)數(shù)(Automatic Reference Counting)。與garbage收集器不同,只要引用計(jì)數(shù)歸零,ARC就會(huì)回收內(nèi)存,因此更為準(zhǔn)確。
作為提供類(lèi)型注釋的編譯語(yǔ)言,Swift和Julia比Python速度更快,功能更強(qiáng)大。僅僅這一點(diǎn),可能就足以讓開(kāi)發(fā)人員推薦它們。
Python在并行性方面有局限性
Python最大的缺點(diǎn)不是速度慢,而是并行計(jì)算的局限性。簡(jiǎn)單地說(shuō),Python使用GIL(全局解釋器鎖)——它會(huì)通過(guò)阻止多個(gè)線程同時(shí)執(zhí)行,來(lái)提高單個(gè)線程的性能。該過(guò)程有一個(gè)很大的障礙:開(kāi)發(fā)人員不能使用多個(gè) CPU核心來(lái)進(jìn)行密集的計(jì)算。
我們?cè)诶肞ython與Tensorflow、PyTorch 等C/C++庫(kù)的互操作性方面做得不錯(cuò)。這一點(diǎn)眾所周知,我也十分贊同。但是Python包裝器并不能解決所有調(diào)試問(wèn)題,最后還是得靠C和C++檢查底層代碼。從根本上說(shuō),Python的優(yōu)勢(shì)在低層無(wú)效,這點(diǎn)足以讓Python出局。
這一因素很快將決定Python的衰落、Julia和Swift的崛起。Julia專(zhuān)門(mén)用來(lái)解決Python的缺陷,主要有三個(gè)特性:協(xié)同程序(異步任務(wù))、多線程和分布式計(jì)算,這些特性都展示出并發(fā)和并行編程的無(wú)限可能,這種結(jié)構(gòu)使Julia能夠以比Python更快的速度執(zhí)行科學(xué)計(jì)算并解決大數(shù)據(jù)問(wèn)題。
另一方面,Swift有一切開(kāi)發(fā)移動(dòng)應(yīng)用所需的工具,能夠進(jìn)行并行計(jì)算。
圖源:unsplash
Swift和Julia都擁有Python的互操作性和強(qiáng)大的支持
雖然在速度、多線程和類(lèi)型安全方面有不足之處,但Python有包含大量庫(kù)和程序包的巨型生態(tài)系統(tǒng)。在Python面前,Swift和Julia在機(jī)器學(xué)習(xí)領(lǐng)域仍然是個(gè)“弟弟”,擁有的庫(kù)數(shù)量非常有限。然而,Julia和Swift比Python更強(qiáng)的互操作性大大彌補(bǔ)了二者庫(kù)支持的不足的缺點(diǎn)。
Julia不僅允許程序員使用Python代碼(反之亦然),還能與C語(yǔ)言、R語(yǔ)言、Java以及幾乎所有主要編程語(yǔ)言的進(jìn)行互操作。這種多功能性能有力推動(dòng)這種語(yǔ)言的發(fā)展,增加它被數(shù)據(jù)科學(xué)家迅速采用的機(jī)會(huì)。
另一方面,Swift通過(guò)PythonKi 庫(kù)提供了與Python的互操作性。Swift(起源于蘋(píng)果)最大的賣(mài)點(diǎn)是它得到了谷歌的大力支持,十幾年前收益于全力支持而崛起的正是Python,可真是風(fēng)水輪流轉(zhuǎn)。
另外,Swift的創(chuàng)建者Chris Lattner正在谷歌的AI brain團(tuán)隊(duì)工作,這表明Swift正在被重點(diǎn)培養(yǎng),以在機(jī)器學(xué)習(xí)領(lǐng)域的取代Python。
Tensorflow團(tuán)隊(duì)通過(guò)S4TF項(xiàng)目投資了Swift,這進(jìn)一步證明了該語(yǔ)言不僅僅是Python的修飾版。相反,Swift 憑借其差異化的編程支持和像C語(yǔ)言一樣的低層級(jí)工作能力,將有可能被用來(lái)取代支撐深度學(xué)習(xí)的工具。
圖源:unsplash
隨著數(shù)據(jù)量的不斷增加,Python的致命弱點(diǎn)很快就會(huì)浮現(xiàn)。注重易用性和快速編碼能力的日子一去不復(fù)返,速度和并行計(jì)算才是游戲的主角。Python 作為一種通用語(yǔ)言,將不再解決這些問(wèn)題。Python終會(huì)退場(chǎng),而Julia和Swift似乎就是候選接任者。
不過(guò),我并不是說(shuō)作為編程語(yǔ)言的Python會(huì)立刻消失,它會(huì)一點(diǎn)一點(diǎn)淡出人們的視線。Python在數(shù)據(jù)科學(xué)中的地位將逐漸降低,專(zhuān)門(mén)為深度學(xué)習(xí)而設(shè)計(jì)的語(yǔ)言才是未來(lái)主流。