Python為何能坐穩 AI 時代頭牌語言

誰會成為AI 和大數據時代的第一開發語言?

這本已是一個不需要爭論的問題。如果說三年前,Matlab、Scala、R、Java 和 Python還各有機會,局面尚且不清楚,那麼三年之後,趨勢已經非常明確了,特別是前兩天 Facebook 開源了 PyTorch 之後,Python 作為 AI 時代頭牌語言的位置基本確立,未來的懸念僅僅是誰能坐穩第二把交椅。

不過聲音市場上還有一些雜音。最近一個有意學習數據科學的姑娘跟我說,她的一個朋友建議她從 Java 入手,因為 Hadoop 等大數據基礎設施是用 Java 寫的。

無獨有偶,上個月 IBM developerWorks 發表的一篇個人博客(IT Best Kept Secret Is Optimization),用職位招聘網站indeed 上的數據做了一個統計。

這篇文章本身算得上是客觀公正,實事求是,但傳到國內來,就被一些評論者曲解了本意,說 Python 的優勢地位尚未確立,鹿死誰手尚未可知,各位學習者不可盲目跟風啊,千萬要多方押寶,繼續撒胡椒面不要停。

在這裡我要明確表個態,對於希望加入到 AI 和大數據行業的開發人員來說,把雞蛋放在 Python 這個籃子里不但是安全的,而且是必須的。

或者換個方式說,如果你將來想在這個行業混,什麼都不用想,先閉著眼睛把 Python 學會了。

當然,Python不是沒有它的問題和短處,你可以也應該有另外一種甚至幾種語言與 Python 形成搭配,但是Python 將坐穩數據分析和 AI 第一語言的位置,這一點毫無疑問。

我甚至認為,由於 Python 坐穩了這個位置,由於這個行業未來需要大批的從業者,更由於Python正在迅速成為全球大中小學編程入門課程的首選教學語言,這種開源動態腳本語言非常有機會在不久的將來成為第一種真正意義上的編程世界語。

討論編程語言的優劣興衰一直被認為是一個口水戰話題,被資深人士所不屑。但是我認為這次 Python 的上位是一件大事。

請設想一下,如果十五年之後,所有40歲以下的知識工作者,無分中外,從醫生到建築工程師,從辦公室秘書到電影導演,從作曲家到銷售,都能使用同一種編程語言進行基本的數據處理,調用雲上的人工智慧 API,操縱智能機器人,進而相互溝通想法,那麼這一普遍編程的協作網路,其意義將遠遠超越任何編程語言之爭。目前看來,Python 最有希望擔任這個角色。

Python 的勝出令人意外,因為它缺點很明顯。

它語法上自成一派,讓很多老手感到不習慣;「裸」 Python 的速度很慢,在不同的任務上比C 語言大約慢數十倍到數千倍不等;由於全局解釋器鎖(GIL)的限制,單個Python 程序無法在多核上並發執行;Python 2 和 Python 3 兩個版本長期並行,很多模塊需要同時維護兩個不同的版本,給開發者選擇帶來了很多不必要的混亂和麻煩;由於不受任何一家公司的控制,一直以來也沒有一個技術巨頭肯死挺 Python 。

所以,相對於 Python 的應用之廣泛,其核心基礎設施所得到的投入和支持其實是非常薄弱的。

直到今天,26歲的Python 都還沒有一個官方標配的 JIT 編譯器,相比之下, Java 語言在其發布之後頭三年內就獲得了標配 JIT 。

另一個事情更能夠說明問題。Python 的 GIL 核心代碼 1992 年由該語言創造者 Guido van Rossum 編寫,此後十八年時間沒有一個人對這段至關重要的代碼改動過一個位元組。

十八年!直到2010年,Antoine Pitrou才對 GIL 進行了近二十年來的第一次改進,而且還僅在 Python 3.x 版本中使用。這也就是說,今天使用 Python 2.7 的大多數開發者,他們所寫的每一段程序仍然被26年前的一段代碼牢牢制約著。

說到 Python 的不足,我就想起發生在自己身上的一段小小的軼事。我多年前曾經在一篇文章里聲明自己看好 Python,而不看好 Ruby。

大概兩年多以前,有一個網友在微博里找到我,對我大加責備,說因為當年讀了我這篇文章,誤聽讒言,鬼迷心竅,一直專攻 Python,而始終對 Ruby 敬而遠之。

結果他Python 固然精通,但最近一學 Ruby,如此美好,如此甜蜜,喜不自勝,反過來憤然意識到,當年完全被我誤導了,在最美的年華錯過了最美的編程語言。

我當時沒有更多的與他爭辯,也不知道他今天是否已經從Python後端、大數據分析、機器學習和 AI 工程師成功轉型為Rails快速開發高手。我只是覺得,想要真正認識一件事物的價值,確實也不是一件容易的事情。

Python 就是這樣一個帶著各種毛病衝到第一方陣的賽車手,但即便到了幾年前,也沒有多少人相信它有機會摘取桂冠,很多人認為 Java 的位置不可動搖,還有人說一切程序都將用 JavaScript重寫。

但今天我們再看,Python 已經是數據分析和 AI的第一語言,網路攻防的第一黑客語言,正在成為編程入門教學的第一語言,雲計算系統管理第一語言。

Python 也早就成為Web 開發、遊戲腳本、計算機視覺、物聯網管理和機器人開發的主流語言之一,隨著 Python 用戶可以預期的增長,它還有機會在多個領域裡登頂。

而且不要忘了,未來絕大多數的 Python 用戶並不是專業的程序員,而是今天還在使用 Excel、PowePoint、SAS、Matlab和視頻編輯器的那些人。

就拿 AI 來說,我們首先要問一下,AI 的主力人群在哪裡?如果我們今天靜態的來談這個話題,你可能會認為 AI 的主力是研究機構里的 AI 科學家、擁有博士學位的機器學習專家和演算法專家。

但上次我提到李開復的「AI紅利三段論」明確告訴我們,只要稍微把眼光放長遠一點,往後看三至五年,你會看到整個 AI 產業的從業人口將逐漸形成一個巨大的金字塔結構,上述的 AI 科學家僅僅是頂端的那麼一點點,95% 甚至更多的 AI 技術人員,都將是AI 工程師、應用工程師和AI 工具用戶。

我相信這些人幾乎都將被Python 一網打盡,成為 Python 陣營的龐大後備軍。

這些潛在的 Python 用戶至今仍然在技術圈子之外,但隨著 AI 應用的發展,數百萬之眾的教師、公司職員、工程師、翻譯、編輯、醫生、銷售、管理者和公務員將裹挾著各自領域中的行業知識和數據資源,湧入 Python 和 AI 大潮之中,深刻的改變整個 IT,或者說 DT (數據科技)產業的整體格局和面貌。

為什麼 Python 能夠後來居上呢?

如果泛泛而論,我很可以列舉 Python 的一些優點,比如語言設計簡潔優雅,對程序員友好,開發效率高。但我認為這不是根本原因,因為其他一些語言在這方面表現得並不差。

還有人認為 Python 的優勢在於資源豐富,擁有堅實的數值演算法、圖標和數據處理基礎設施,建立了非常良好的生態環境,吸引了大批科學家以及各領域的專家使用,從而把雪球越滾越大。

但我覺得這是倒因為果。為什麼偏偏是 Python 能夠吸引人們使用,建立起這麼好的基礎設施呢?為什麼世界上最好的語言 PHP 裡頭就沒有 numpy 、NLTK、sk-learn、pandas 和 PyTorch 這樣級別的庫呢?為什麼 JavaScript 極度繁榮之後就搞得各種程序庫層次不齊,一地雞毛,而 Python 的各種程序庫既繁榮又有序,能夠保持較高水準呢?

我認為最根本的原因只有一點:Python 是眾多主流語言中唯一一個戰略定位明確,而且始終堅持原有戰略定位不動搖的語言。相比之下,太多的語言不斷的用戰術上無原則的勤奮去侵蝕和模糊自己的戰略定位,最終只能等而下之。

Python 的戰略定位是什麼?其實很簡單,就是要做一種簡單、易用但專業、嚴謹的通用組合語言,或者叫膠水語言,讓普通人也能夠很容易的入門,把各種基本程序元件拼裝在一起,協調運作。

正是因為堅持這個定位,Python 始終把語言本身的優美一致放在奇技妙招前面,始終把開發者效率放在CPU效率前面,始終把橫向擴張能力放在縱向深潛能力之前。長期堅持這些戰略選擇,為 Python 帶來了其他語言望塵莫及的豐富生態。

比如說,任何一個人,只要願意學習,可以在幾天的時間裡學會Python基礎部分,然後干很多很多事情,這種投入產出比可能是其他任何語言都無法相比的。

再比如說,正是由於 Python 語言本身慢,所以大家在開發被頻繁使用的核心程序庫時,大量使用 C 語言跟它配合,結果用 Python 開發的真實程序跑起來非常快,因為很有可能超過 80% 的時間系統執行的代碼是 C 寫的。

相反,如果 Python 不服氣,非要在速度上較勁,那麼結果很可能是裸速提高個幾倍,但這樣就沒人有動力為它開發 C 模塊了,最後的速度遠不如混合模式,而且很可能語言因此會變得更複雜,結果是一個又慢又醜陋的語言。

更重要的是,Python 的包裝能力、可組合性、可嵌入性都很好,可以把各種複雜性包裝在 Python 模塊里,暴露出漂亮的介面。

很多時候,一個程序庫本身是用 C/C++ 寫的,但你會發現,直接使用 C 或者 C++ 去調用那個程序庫,從環境配置到介面調用,都非常麻煩,反而隔著一層,用其python 包裝庫更加清爽整潔,又快又漂亮。這些特點到了 AI 領域中,就成了 Python 的強大優勢。

Python 也藉助 AI 和數據科學,攀爬到了編程語言生態鏈的頂級位置。Python 與 AI綁在一起,對它們來說,無論是電子商務、搜索引擎、社交網路還是智能硬體,未來都只是生態鏈下游的數據奶牛、電子神經和執行工具,都將聽命於自己。

對編程語言發展歷史缺乏了解的人可能會覺得,Python 的戰略定位是犬儒主義和缺乏進取心的。但事實證明,能同時做到簡單而嚴謹、易用而專業,是很難的,而能夠堅守膠水語言的定位,更是難上加難。

有的語言,從一開始就是出於學術而非實用的目的,學習曲線過於陡峭,一般人很難接近。

有的語言,過於依賴背後金主的商業支持,好的時候風光無限,一旦被打入冷宮,連生存下去都成問題。

有的語言,設計的時候有明確的假想場景,要麼是為了解決大規模並發,要麼是為了解決矩陣運算,要麼是為了做網頁渲染模板,一旦離開這個場景,就各種不爽。

更多的語言,剛剛取得一點成功,就迫不及待的想成為全能冠軍,在各個方向上拚命的伸展觸角,特別是在增強表達能力和提升性能方面經常過分積極,不惜將核心語言改得面目全非,最後變成誰都無法掌控的龐然大物。

相比之下,Python 是現代編程語言設計和演化當中的一個成功典範。

Python 之所以在戰略定位上如此清晰,戰略堅持上如此堅定,歸根結底是因為其社區構建了一個堪稱典範的決策和治理機制。

這個機制以 Guido van Rossum (BDFL,Pythoners 都知道這是什麼意思), DavidBeazley, Raymond Hettinger 等人為核心,以 PEP 為組織平台,民主而有序,集中而開明。只要這個機制本身得以維繫,Python 在可見的未來里仍將一路平穩上行。

最有可能向 Python 發起挑戰的,當然是Java。Java 的用戶存量大,它本身也是一種戰略定位清晰而且非常堅定的語言。

但我並不認為 Java 有很大的機會,因為它本質上是為構造大型複雜系統而設計的。什麼是大型複雜系統?就是由人清清楚楚描述和構造出來的系統,其規模和複雜性是外生的,或者說外界賦予的。

而 AI 的本質是一個自學習、自組織的系統,其規模和複雜性是一個數學模型在數據的餵養下自己長出來的,是內生的。

因此,Java大多數的語言結構對於大數據的處理和 AI 系統的開發顯得使不上勁,你強的東西這裡用不上,這裡需要的東西你做起來又彆扭。

而 Python 在數據處理方面的簡潔強悍早就盡人皆知。對比兩個功能相同的 Java 和 Python 機器學習程序,正常人只要看兩眼就能做出判斷,一定是 Python 程序更加清爽痛快。

大概在 2003 或者 2004 年的時候,我買過一本 Python 的書,作者是一位巴西人。他說自己之所以堅定的選擇 Python,是因為他小時候經常夢到未來世界將由一條大蟒蛇(蟒蛇的英文為python)統治。

我當時覺得這哥們好可憐,做個夢都能夢到這麼恐怖的場景。但今天來看,也許他只是像黑客帝國里的程序員安德森一樣,不小心穿越到未來,並且窺探到了世界的真相。

本文作者:子白

來源/公眾號:AI100(ID:rgznai100)

最近很多人私信問我問題,平常知乎評論看到不多,如果沒有及時回復,大家也可以加小編微信:tszhihu,進知乎大數據分析挖掘交流群,可以跟各位老師互相交流。謝謝。

推薦閱讀:

10min手寫(一):伺服器內存監控系統
為什麼 x in range(1000000000000001) 的執行速度這麼快
如何看待將Python代碼轉換成Go代碼並進一步編譯的 Grumpy 項目?
基於ArcGIS的python編程:2.python基礎(一)

TAG:Python | 人工智能 | 大数据分析 |