隨著人工智能的興起,Python這門(mén)曾經(jīng)小眾的編程語(yǔ)言可謂是煥發(fā)了第二春。
創(chuàng)新互聯(lián)-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比興安盟網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式興安盟網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋興安盟地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴(lài)。
以tensorflow、pytorch等為主的機(jī)器學(xué)習(xí)/深度學(xué)習(xí)的開(kāi)發(fā)框架大行其道,助推了python這門(mén)曾經(jīng)以爬蟲(chóng)見(jiàn)長(zhǎng)(python粉別生氣)的編程語(yǔ)言在TIOBE編程語(yǔ)言排行榜上一路披荊斬棘,坐上前三甲的寶座,僅次于Java和C,將C++、JavaScript、PHP、C#等一眾勁敵斬落馬下。
當(dāng)然,軒轅君向來(lái)是不提倡編程語(yǔ)言之間的競(jìng)爭(zhēng)對(duì)比,每一門(mén)語(yǔ)言都有自己的優(yōu)勢(shì)和劣勢(shì),有自己應(yīng)用的領(lǐng)域。
另一方面,TIOBE統(tǒng)計(jì)的數(shù)據(jù)也不能代表國(guó)內(nèi)的實(shí)際情況,上面的例子只是側(cè)面反映了Python這門(mén)語(yǔ)言如今的流行程度。
Java 還是 Python
說(shuō)回咱們的需求上來(lái),如今在不少的企業(yè)中,同時(shí)存在Python研發(fā)團(tuán)隊(duì)和Java研發(fā)團(tuán)隊(duì),Python團(tuán)隊(duì)負(fù)責(zé)人工智能算法開(kāi)發(fā),而Java團(tuán)隊(duì)負(fù)責(zé)算法工程化,將算法能力通過(guò)工程化包裝提供接口給更上層的應(yīng)用使用。
可能大家要問(wèn)了,為什么不直接用Java做AI開(kāi)發(fā)呢?要弄兩個(gè)團(tuán)隊(duì)。其實(shí),現(xiàn)在包括TensorFlow在內(nèi)的框架都逐漸開(kāi)始支持Java平臺(tái),用Java做AI開(kāi)發(fā)也不是不行(軒轅君的前同事就已經(jīng)在這樣做了),但限于歷史原因,做AI開(kāi)發(fā)的人本就不多,而這一些人絕大部分都是Python技術(shù)棧入坑,Python的AI開(kāi)發(fā)生態(tài)已經(jīng)建設(shè)的相對(duì)完善,所以造成了在很多公司中算法團(tuán)隊(duì)和工程化團(tuán)隊(duì)使用不同的語(yǔ)言。
現(xiàn)在該拋出本文的重要問(wèn)題:Java工程化團(tuán)隊(duì)如何調(diào)用Python的算法能力?
答案基本上只有一個(gè):Python通過(guò)Django/Flask等框架啟動(dòng)一個(gè)Web服務(wù),Java中通過(guò)Restful API與之進(jìn)行交互
上面的方式的確可以解決問(wèn)題,但隨之而來(lái)的就是性能問(wèn)題。尤其是在用戶(hù)量上升后,大量并發(fā)接口訪問(wèn)下,通過(guò)網(wǎng)絡(luò)訪問(wèn)和Python的代碼執(zhí)行速度將成為拖累整個(gè)項(xiàng)目的瓶頸。
當(dāng)然,不差錢(qián)的公司可以用硬件堆出性能,一個(gè)不行,那就多部署幾個(gè)Python Web服務(wù)。
那除此之外,有沒(méi)有更實(shí)惠的解決方案呢?這就是這篇文章要討論的問(wèn)題。
上面的性能瓶頸中,拖累執(zhí)行速度的原因主要有兩個(gè):
眾所周知,Python是一門(mén)解釋型腳本語(yǔ)言,一般來(lái)說(shuō),在執(zhí)行速度上:
解釋型語(yǔ)言 < 中間字節(jié)碼語(yǔ)言 < 本地編譯型語(yǔ)言
自然而然,我們要努力的方向也就有兩個(gè):
結(jié)合上面的兩個(gè)點(diǎn),我們的目標(biāo)也清晰起來(lái):
將Python代碼轉(zhuǎn)換成Java可以直接本地調(diào)用的模塊
對(duì)于Java來(lái)說(shuō),能夠本地調(diào)用的有兩種:
其實(shí)我們通常所說(shuō)的Python指的是CPython,也就是由C語(yǔ)言開(kāi)發(fā)的解釋器來(lái)解釋執(zhí)行。而除此之外,除了C語(yǔ)言,不少其他編程語(yǔ)言也能夠按照Python的語(yǔ)言規(guī)范開(kāi)發(fā)出虛擬機(jī)來(lái)解釋執(zhí)行Python腳本:
如果能夠在JVM中直接執(zhí)行Python腳本,與Java業(yè)務(wù)代碼的交互自然是最簡(jiǎn)單不過(guò)。但隨后的調(diào)研發(fā)現(xiàn),這條路很快就被堵死了:
這條路行不通,那還有一條:把Python代碼轉(zhuǎn)換成Native代碼塊,Java通過(guò)JNI的接口形式調(diào)用。
先將Python源代碼轉(zhuǎn)換成C代碼,之后用GCC編譯C代碼為二進(jìn)制模塊so/dll,接著進(jìn)行一次Java Native接口封裝,使用Jar打包命令轉(zhuǎn)換成Jar包,然后Java便可以直接調(diào)用。
流程并不復(fù)雜,但要完整實(shí)現(xiàn)這個(gè)目標(biāo),有兩個(gè)關(guān)鍵問(wèn)題需要解決:
1.Python代碼如何轉(zhuǎn)換成C代碼?
終于要輪到本文的主角登場(chǎng)了,將要用到的一個(gè)核心工具叫:Cython
請(qǐng)注意,這里的Cython和前面提到的CPython不是一回事。CPython狹義上是指C語(yǔ)言編寫(xiě)的Python解釋器,是Windows、Linux下我們默認(rèn)的Python腳本解釋器。
而Cython是Python的一個(gè)第三方庫(kù),你可以通過(guò)pip install Cython
進(jìn)行安裝。
官方介紹Cython是一個(gè)Python語(yǔ)言規(guī)范的超集,它可以將Python+C混合編碼的.pyx腳本轉(zhuǎn)換為C代碼,主要用于優(yōu)化Python腳本性能或Python調(diào)用C函數(shù)庫(kù)。
聽(tīng)上去有點(diǎn)復(fù)雜,也有點(diǎn)繞,不過(guò)沒(méi)關(guān)系,get一個(gè)核心點(diǎn)即可:Cython能夠把Python腳本轉(zhuǎn)換成C代碼
來(lái)看一個(gè)實(shí)驗(yàn):
# FileName: test.py def test_function(): print("this is print from python script")
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。