Python風(fēng)靡全宇宙,首要原因竟是它?
眾所周知,Python是目前使用最廣泛且用戶增長(zhǎng)最快的編程語言。優(yōu)雅簡(jiǎn)潔的語法、強(qiáng)大的第三方庫(kù)支持等都是Python能夠風(fēng)靡各行各業(yè)的原因。然而,你或許不知道,Python能夠?qū)崿F(xiàn)用戶飛速增長(zhǎng),背后其實(shí)另有玄機(jī)。
就讓我們從近年來大數(shù)據(jù)的興起說起,為你娓娓道來Python火爆的真正原因。
郁悶的大數(shù)據(jù)程序員
隨著大數(shù)據(jù)的崛起,大多數(shù)行業(yè)發(fā)現(xiàn)自己進(jìn)入了一種恐慌狀態(tài):他們花費(fèi)了大量的時(shí)間和金錢來建立他們的大數(shù)據(jù)渠道,但是他們的投資回報(bào)率卻很低。在毫無喘息機(jī)會(huì)的競(jìng)爭(zhēng)中,雖然能夠挖取到日益增長(zhǎng)的數(shù)據(jù),但大多數(shù)公司并沒有一個(gè)明確的計(jì)劃來處理他們挖取到的數(shù)據(jù)。當(dāng)時(shí),幾乎每個(gè)人都認(rèn)為,有了大量的數(shù)據(jù)存儲(chǔ),后面的分析就會(huì)變得更簡(jiǎn)單,數(shù)據(jù)的業(yè)務(wù)價(jià)值也會(huì)變得顯而易見。這在今天聽起來可能很愚蠢,但大多數(shù)人依舊認(rèn)為,只要獲取到足夠的數(shù)據(jù),數(shù)據(jù)背后的規(guī)律和信息就會(huì)自動(dòng)浮現(xiàn)。
被時(shí)代召喚的“數(shù)據(jù)科學(xué)家”
隨后,業(yè)界幾乎同時(shí)覺醒,他們希望得到的各種卓越遠(yuǎn)見和希望回答的問題都需要嚴(yán)格的數(shù)學(xué)分析和驗(yàn)證。 SQL查詢能讓你知道數(shù)據(jù)最明顯的模式和趨勢(shì),但要想獲取數(shù)據(jù)中最為有用的信息,你需要的其實(shí)是完全不同的另一套技術(shù)——一套牢固扎根于數(shù)學(xué)和應(yīng)用數(shù)學(xué)的技能。而具備這種技術(shù)的人才似乎只存在于學(xué)術(shù)界中。此外,負(fù)責(zé)分析這些龐大數(shù)據(jù)集的人不僅需要非常強(qiáng)大的數(shù)學(xué)背景,還需要能夠編寫軟件。這也不難解釋為什么“數(shù)據(jù)科學(xué)家”這一職位頻繁出現(xiàn)在招聘網(wǎng)站上了。
Ruby與Python的“Web開發(fā)語言之爭(zhēng)”
我們?cè)偻刂v講,在大數(shù)據(jù)還沒有真正風(fēng)靡之前,Ruby和Python曾在成為***的“web開發(fā)語言”上發(fā)生過激烈的爭(zhēng)戰(zhàn)。 兩者都非常適合開發(fā)Web應(yīng)用程序。 Ruby的受歡迎程度與Rails框架密切相關(guān)。 在那個(gè)年代,大多數(shù)自稱為“Ruby程序員”其實(shí)更應(yīng)該稱自己為 “Rails程序員”。 而Python在學(xué)術(shù)界和少數(shù)不同行業(yè)已經(jīng)相當(dāng)完善。 在Python中,與Rails最相近的是Django,Django盡管在Rails之前發(fā)布,但它的受歡迎程度似乎遠(yuǎn)遠(yuǎn)落后于Rails。
很多人認(rèn)為,Python和Ruby的性能都很相似,最終只會(huì)有一種語言能夠贏得“web開發(fā)語言之戰(zhàn)”。 但實(shí)際上,Ruby的流行度與Rails密切相關(guān),而Django只代表了一個(gè)已經(jīng)很活躍的Python生態(tài)系統(tǒng)的一小部分。事實(shí)也證明,“Web開發(fā)語言之戰(zhàn)”的重要性遠(yuǎn)低于人們的預(yù)期。即便從很多層面來講,Ruby都憑借Rails贏得了這場(chǎng)爭(zhēng)戰(zhàn),但這絲毫不影響Python成為當(dāng)今***的語言。這到底是為什么呢?
Oliphant的大手筆
為了揭開這個(gè)謎團(tuán),我們就不得不提一下一位大佬了,他就是Travis Oliphant。追溯到2006年。當(dāng)時(shí),Travis Oliphant還是BYU的助理教授,他仍未創(chuàng)辦Anaconda(注:Anaconda是一個(gè)完全以Python為基礎(chǔ)的,目前最成功的商業(yè)數(shù)據(jù)科學(xué)平臺(tái)之一)。 一年前,他參考科學(xué)計(jì)算庫(kù)Numeric開發(fā)了NumPy。 他后來又成為SciPy的創(chuàng)始人并兼任了PSF的主管。
在2006年,他與Carl Banks一起提交了PEP 3118,這是Python的“緩沖區(qū)協(xié)議”的修訂版。這為Python的興起埋下了重要伏筆。
Python的緩沖協(xié)議:Python風(fēng)靡全球的首要原因
緩沖器協(xié)議是(并且仍然是)一個(gè)極低級(jí)別的API,被其他庫(kù)用來直接操縱內(nèi)存緩沖區(qū)。 這些是由解釋器創(chuàng)建和使用的緩沖器,用于存儲(chǔ)連續(xù)存儲(chǔ)器中某些類型的數(shù)據(jù)(最初,主要是“類似數(shù)組的”數(shù)據(jù)類型和大小都被提前給出的數(shù)據(jù)結(jié)構(gòu))。
提供這樣一個(gè)API的主要?jiǎng)訖C(jī)是:消除在只讀取時(shí)復(fù)制數(shù)據(jù)的必要性,澄清緩沖區(qū)的所有權(quán)轉(zhuǎn)移語意,并將數(shù)據(jù)存儲(chǔ)在連續(xù)的存儲(chǔ)器中(即使在多維數(shù)據(jù)結(jié)構(gòu)的情況下),其中讀取訪問速度非???。 那些將使用該API的“其他庫(kù)”一般都是用C寫的,而且對(duì)性能十分敏感。 這一新協(xié)議意味著,如果我創(chuàng)建了一個(gè)NumPy的int數(shù)組,其他庫(kù)可以直接訪問底層內(nèi)存緩沖區(qū),而不是間接訪問或者在使用該數(shù)據(jù)之前復(fù)制該數(shù)據(jù)。
現(xiàn)在問題來了:什么類型的程序員會(huì)從快速、零拷貝的大量數(shù)據(jù)獲取中受益呢?
當(dāng)然是數(shù)據(jù)科學(xué)家了!
讓我們們來梳理一下事件的發(fā)展過程:
-
Oliphant和Banks提出了Python的緩沖協(xié)議的修訂,以簡(jiǎn)化對(duì)剛開始的NumPy項(xiàng)目工作所驅(qū)動(dòng)的某些數(shù)據(jù)結(jié)構(gòu)的底層內(nèi)存的直接訪問。
-
PEP 3118(https://www.python.org/dev/peps/pep-3118/) 提交,被認(rèn)可,實(shí)施。
-
受益于PEP 3118的實(shí)現(xiàn),Python已悄然成為一個(gè)非常吸引人的編譯語言。在此基礎(chǔ)上,就有了很多基于C語言擴(kuò)展的數(shù)字計(jì)算庫(kù)被開發(fā)出來(注:C語言擴(kuò)展可以很便捷地實(shí)現(xiàn)數(shù)據(jù)共享和操作。)
-
Python和Ruby在網(wǎng)絡(luò)上一決雌雄,大多數(shù)人認(rèn)為“Web開發(fā)語言之戰(zhàn)”必有分曉。
-
隨著磁存儲(chǔ)設(shè)備價(jià)格暴跌,存儲(chǔ)大量數(shù)據(jù)以供日后分析變得可行(因?yàn)閿?shù)據(jù)已經(jīng)變得很廉價(jià),***是先把數(shù)據(jù)保存起來,甚至都不需要去考慮具體要分析什么。)
-
對(duì)新一代程序員的需求發(fā)生變化:具有統(tǒng)計(jì)學(xué)背景,***還得有應(yīng)用數(shù)學(xué)背景的,且先前有過一些編程經(jīng)驗(yàn)的程序員開始被哄搶——數(shù)據(jù)科學(xué)家的時(shí)代來臨了!
-
數(shù)據(jù)科學(xué)家們想尋找一種既具有表現(xiàn)力又快速的語言(具有良好的數(shù)值計(jì)算庫(kù)支持啟動(dòng)),所有的這些需求都指向于Python
后來,就如我們看到的那樣,Python受到萬千寵愛,一躍成為了***的編程語言。
作者:Jeff Knupp
翻譯:吳蕾、霍靜