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