王雄
過去幾年,Python成為人工智能和數(shù)據(jù)科學(xué)領(lǐng)域最受歡迎的編程語言。但是隨著5G時代的來臨,生產(chǎn)環(huán)境對AI應(yīng)用的性能要求越來越高,Python有點(diǎn)“力不從心”。天生支持并發(fā)的Golang應(yīng)運(yùn)而生,有專家稱,Go語言將統(tǒng)治人工智能的下一個10年。
30年前,Python首次出現(xiàn),但是Python花了20年的時間才得到公眾的認(rèn)可,根據(jù)2019年Stack Overflow的調(diào)查,Python成為開發(fā)人員第二喜愛的語言。過去的5年里,Python的成長無疑是巨大的,已經(jīng)成為機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)開發(fā)人員的首選語言。
短時間來看,Python的主導(dǎo)地位大概率不會變,但是與一些新興的語言相比,它有嚴(yán)重的缺點(diǎn),將成為生產(chǎn)環(huán)境部署的障礙。
與其他語言相比,它的語法很簡單,任何人都可以在幾個小時或幾天內(nèi)學(xué)會Python的基礎(chǔ)知識。即使在學(xué)習(xí)了C++或Java等其他語言之后,開發(fā)人員還是更愿意使用Python。因?yàn)闊o論想做什么,總有一個Python庫能滿足你的需求,這些庫讓開發(fā)數(shù)據(jù)科學(xué)和AI類的應(yīng)用變的簡單高效。
但Python在大規(guī)模生產(chǎn)環(huán)境下的性能問題,直接影響了AI應(yīng)用的開發(fā)效率?,F(xiàn)在很多人工智能初創(chuàng)企業(yè),正處于底層架構(gòu)的構(gòu)建階段,檢查Python的問題很有必要。
Python是一個解釋性語言,這導(dǎo)致它執(zhí)行起來比較慢,與其他編程語言如C++和Go相比,Python的執(zhí)行速度就像烏龜一樣,所以很多AI模型雖然是用Python開發(fā)的原型,部署時還得轉(zhuǎn)成其他語言。
Python是一種動態(tài)類型語言,變量的數(shù)據(jù)類型在運(yùn)行時自動判斷,也使得執(zhí)行速度變慢。為了克服Python的速度,很多Python庫選擇更快的語言來重寫,例如TensorFlow、Numpy和Pandas部分是用C或C++編寫的,它們有助于顯著提高執(zhí)行速度。這就有點(diǎn)像拄著拐走路,一直需要外界的幫助。
隨著5G時代的來臨,多任務(wù)并行處理和實(shí)時性的需求猛增,Python是可以構(gòu)建小而美的應(yīng)用,但是大規(guī)模、高吞吐的場景下,表現(xiàn)不盡如人意。雖然有很多方法來提高Python的并行計(jì)算的能力,但都是“曲線救國”,并沒有實(shí)現(xiàn)真正意義的并行,因?yàn)镻ython中存在一個GIL鎖,每次只允許程序執(zhí)行一個線程。
GIL的全稱是Global Interpreter Lock,意思是全局解釋器鎖,是Python之父為了數(shù)據(jù)安全而設(shè)計(jì)的,那時計(jì)算機(jī)主頻還沒有達(dá)到1 GByte,程序全部都是運(yùn)行在單核計(jì)算機(jī)上面。
某個線程想要執(zhí)行,必須先拿到GIL,可以把GIL看作是CPU的“通行證”,拿不到通行證就不允許進(jìn)入CPU執(zhí)行,Python的多線程實(shí)際上并沒有利用到多核計(jì)算的優(yōu)勢,它不管你有幾個核,100個核也只能一次跑一個線程。
所以,原生的Python在性能上是有諸多限制的。人工智能和數(shù)據(jù)科學(xué)領(lǐng)域,對性能需求又很高,那有沒有一種語言既有Python簡單易用的優(yōu)點(diǎn),又能滿足生產(chǎn)需求呢?
這時,Golang應(yīng)運(yùn)而生。
Golang(Go)是一種靜態(tài)和編譯型語言,這意味著它的執(zhí)行速度將比Python快好幾倍。
與Python不同,Go不需要其他語言的幫助來提高速度。Go執(zhí)行幾乎和C++,Java一樣快,而且Go編譯代碼比C++和Java也快得多,有些游戲中Go所需時間只有Python的百分之一。
Go的語法也很簡單,程序?qū)懲旰罂梢灾苯泳幾g成二進(jìn)制文件執(zhí)行,25個關(guān)鍵字就能表達(dá)你能想到的所有招式,想干啥事就Go一下。
Go最大的特色就是天生支持并發(fā),不需要像其他編程語言那樣需要開發(fā)者自行實(shí)現(xiàn),或借助第三方庫實(shí)現(xiàn),邏輯簡單通俗易懂。
Go使用Goroutine來實(shí)現(xiàn)并發(fā),Goroutine是可以同時獨(dú)立運(yùn)行的函數(shù),只占用2 KByte的內(nèi)存,所以單機(jī)同時運(yùn)行成千上萬個Goroutine,也沒問題。
不同于其他腳本或解釋性高級編程語言,Go編寫的代碼可直接了當(dāng)編譯成機(jī)器碼高效執(zhí)行。x86,AMD64(x86_64),ARM,Linux,Windows,Darwin(OSX),F(xiàn)reeBSD,Android幾乎全平臺支持,真正做到了一碼在手,隨處復(fù)用。
人工智能正在席卷整個世界,機(jī)器學(xué)習(xí)、深度學(xué)習(xí)等模仿人類智能的應(yīng)用程序?qū)映霾桓F,Python可以很好地構(gòu)建原型系統(tǒng),幫我們驗(yàn)證模型是否有利用提高效率。
但現(xiàn)在,對高可擴(kuò)展性和計(jì)算能力的需求,讓Python有點(diǎn)捉襟見肘,而Go則在這些方面表現(xiàn)出了更大的潛力。與Python相比,Go的速度可以快幾十倍、上百倍,吞吐更多的數(shù)據(jù),滿足更高的并發(fā)需求。
根據(jù)Hackearth對來自76個國家的16 000多名開發(fā)者的調(diào)查,Go成為2020年最受歡迎的編程語言,有經(jīng)驗(yàn)的開發(fā)人員中有近三成想學(xué)習(xí)Go,學(xué)生中這一比例也達(dá)到了29 %。知乎在幾年前也將推薦系統(tǒng)從Python切換到了Go。
Go首席布道師許式偉2015年時曾說,Go語言將在兩年內(nèi)制霸云計(jì)算領(lǐng)域,而且Go將統(tǒng)治下一個10年。
Docker、Kubernetes等項(xiàng)目的成功,讓Go在集群計(jì)算和云計(jì)算領(lǐng)域拔得了頭籌,但是Go的腳步并沒有停下。利用機(jī)器學(xué)習(xí)、深度學(xué)習(xí)來預(yù)測和推理,最終目的還是為了生產(chǎn)服務(wù)。Go對生產(chǎn)環(huán)境的支持要遠(yuǎn)遠(yuǎn)好于Python,比如Go語言開發(fā)的Cortex,可以將Python開發(fā)的AI模型快速、穩(wěn)定地部署至生產(chǎn)環(huán)境。
Go和Python兩大社區(qū)的開發(fā)人員也爭論過哪種語言更好,似乎,誰也沒完全說服誰。但越來越多的公司采用Go搭建基礎(chǔ)架構(gòu),至少證明對生產(chǎn)環(huán)境來說,Go更加合適。