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

来源:http://www.cnblogs.com/feixuelove1009/archive/2017/07/18/7202559.html
-Advertisement-
Play Games

原文鏈接:https://mp.weixin.qq.com/s?__biz=MzI0ODcxODk5OA==&mid=2247487055&idx=2&sn=ca0fe8740b78deb208c82eea73d56b37 誰會成為AI 和大數據時代的第一開發語言?這本已是一個不需要爭論的問題。如果 ...


原文鏈接:https://mp.weixin.qq.com/s?__biz=MzI0ODcxODk5OA==&mid=2247487055&idx=2&sn=ca0fe8740b78deb208c82eea73d56b37

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

不過聲音市場上還有一些雜音。最近一個有意學習數據科學的姑娘跟我說,她的一個朋友建議她從 Java 入手,因為 Hadoop 等大數據基礎設施是用 Java 寫的。無獨有偶,上個月 IBM developerWorks 發表的一篇個人博客(https://www.ibm.com/developerworks/community/blogs/jfp/entry/What_Language_Is_Best_For_Machine_Learning_And_Data_Science?lang=en),用職位招聘網站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)統治。我當時覺得這哥們好可憐,做個夢都能夢到這麼恐怖的場景。但今天來看,也許他只是像黑客帝國里的程式員安德森一樣,不小心穿越到未來,並且窺探到了世界的真相。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡單看一下描述,例子最重要。 1、getPath(): 返回定義時的路徑,(就是你寫什麼路徑,他就返回什麼路徑) 2、getAbsolutePath(): 返回絕對路徑,但不會處理“.”和“..”的情況 3、getCanonicalPath(): 返回的是規範化的絕對路徑,相當於將getAbsolu ...
  • 上周, 我們談論了關於Java8的新特性有那些, 什麼是函數式編程, 什麼是Lambda表達式, 這周讓我們繼續談論這些新特性.本周, 我們會聊一下什麼是Stream API, 以及什麼是Optional."Stream API你讓我想重寫我以前的所有代碼","使用Optional讓你的應用從此不再... ...
  • 題目鏈接 Problem Description You are a rich person, and you think your wallet is too heavy and full now. So you want to give me some money by buying a lov ...
  • 什麼是泛型,有什麼用? 先運行下麵的代碼: 上面的代碼稍微修改下: 對比上面的代碼,沒加入泛型的時候,在程式運行期才發現問題,而加入了泛型則在程式編譯期就發現了,這就是泛型的優勢所在。 在第二段代碼中,泛型就好象是在告訴編譯器:這裡聲明的變數c只跟Date類型進行比較,如果跟別的類型比較,那麼就不能 ...
  • Description osu 是一款群眾喜聞樂見的休閑軟體。 我們可以把osu的規則簡化與改編成以下的樣子: 一共有n次操作,每次操作只有成功與失敗之分,成功對應1,失敗對應0,n次操作對應為1個長度為n的01串。在這個串中連續的 X個1可以貢獻X^3 的分數,這x個1不能被其他連續的1所包含(也 ...
  • 轉自:http://blog.csdn.net/xiaoyusmile/article/details/5420252 1. 變數的定義、聲明 變數的聲明有兩種情況: 一種是需要建立存儲空間的。例如:int a。在聲明的時候就已經建立了存儲空間。這種聲明是"定義性聲明(defining declar ...
  • 自學到java的異常時,有一些自己的理解,現在總結一下。 1.為什麼要使用異常 剛開始估計很多初學者和我一樣,不理解為什麼要異常,什麼throws拋出異常,還要catch接住好麻煩的樣子,通過一個簡單的例子來理解一下。 這裡只是一個簡單的異常條件,園的半徑不可能小於等於0的,如果直接用if判斷然後處 ...
  • 前面我們分析了vector,這篇介紹STL中另一個重要的容器list list的設計 list由三部分構成:list節點、list迭代器、list本身 list節點 list是一個雙向鏈表,所以其list節點中有前後兩個指針。如下: list迭代器 前面我們說過vector是利用其記憶體分配類型成員給 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...