Python代碼一鍵轉(zhuǎn)Jar包及Java調(diào)用Python新姿勢-創(chuàng)新互聯(lián)

需求背景

進(jìn)擊的Python

隨著人工智能的興起,Python這門曾經(jīng)小眾的編程語言可謂是煥發(fā)了第二春。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比興安盟網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式興安盟網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋興安盟地區(qū)。費用合理售后完善,十年實體公司更值得信賴。

Python代碼一鍵轉(zhuǎn)Jar包及Java調(diào)用Python新姿勢

以tensorflow、pytorch等為主的機(jī)器學(xué)習(xí)/深度學(xué)習(xí)的開發(fā)框架大行其道,助推了python這門曾經(jīng)以爬蟲見長(python粉別生氣)的編程語言在TIOBE編程語言排行榜上一路披荊斬棘,坐上前三甲的寶座,僅次于Java和C,將C++、JavaScript、PHP、C#等一眾勁敵斬落馬下。

Python代碼一鍵轉(zhuǎn)Jar包及Java調(diào)用Python新姿勢
Python代碼一鍵轉(zhuǎn)Jar包及Java調(diào)用Python新姿勢

當(dāng)然,軒轅君向來是不提倡編程語言之間的競爭對比,每一門語言都有自己的優(yōu)勢和劣勢,有自己應(yīng)用的領(lǐng)域。
另一方面,TIOBE統(tǒng)計的數(shù)據(jù)也不能代表國內(nèi)的實際情況,上面的例子只是側(cè)面反映了Python這門語言如今的流行程度。

Java 還是 Python

說回咱們的需求上來,如今在不少的企業(yè)中,同時存在Python研發(fā)團(tuán)隊和Java研發(fā)團(tuán)隊,Python團(tuán)隊負(fù)責(zé)人工智能算法開發(fā),而Java團(tuán)隊負(fù)責(zé)算法工程化,將算法能力通過工程化包裝提供接口給更上層的應(yīng)用使用。

可能大家要問了,為什么不直接用Java做AI開發(fā)呢?要弄兩個團(tuán)隊。其實,現(xiàn)在包括TensorFlow在內(nèi)的框架都逐漸開始支持Java平臺,用Java做AI開發(fā)也不是不行(軒轅君的前同事就已經(jīng)在這樣做了),但限于歷史原因,做AI開發(fā)的人本就不多,而這一些人絕大部分都是Python技術(shù)棧入坑,Python的AI開發(fā)生態(tài)已經(jīng)建設(shè)的相對完善,所以造成了在很多公司中算法團(tuán)隊和工程化團(tuán)隊使用不同的語言。

現(xiàn)在該拋出本文的重要問題:Java工程化團(tuán)隊如何調(diào)用Python的算法能力?

答案基本上只有一個:Python通過Django/Flask等框架啟動一個Web服務(wù),Java中通過Restful API與之進(jìn)行交互

上面的方式的確可以解決問題,但隨之而來的就是性能問題。尤其是在用戶量上升后,大量并發(fā)接口訪問下,通過網(wǎng)絡(luò)訪問和Python的代碼執(zhí)行速度將成為拖累整個項目的瓶頸。

當(dāng)然,不差錢的公司可以用硬件堆出性能,一個不行,那就多部署幾個Python Web服務(wù)。

那除此之外,有沒有更實惠的解決方案呢?這就是這篇文章要討論的問題。

給Python加速

尋找方向

上面的性能瓶頸中,拖累執(zhí)行速度的原因主要有兩個:

  • 通過網(wǎng)絡(luò)訪問,不如直接調(diào)用內(nèi)部模塊快
  • Python是解釋執(zhí)行,快不起來

眾所周知,Python是一門解釋型腳本語言,一般來說,在執(zhí)行速度上:

解釋型語言 < 中間字節(jié)碼語言 < 本地編譯型語言

自然而然,我們要努力的方向也就有兩個:

  • 能否不通過網(wǎng)絡(luò)訪問,直接本地調(diào)用
  • Python不要解釋執(zhí)行

結(jié)合上面的兩個點,我們的目標(biāo)也清晰起來:

將Python代碼轉(zhuǎn)換成Java可以直接本地調(diào)用的模塊

對于Java來說,能夠本地調(diào)用的有兩種:

  • Java代碼包
  • Native代碼模塊

其實我們通常所說的Python指的是CPython,也就是由C語言開發(fā)的解釋器來解釋執(zhí)行。而除此之外,除了C語言,不少其他編程語言也能夠按照Python的語言規(guī)范開發(fā)出虛擬機(jī)來解釋執(zhí)行Python腳本:

  • CPython: C語言編寫的解釋器
  • Jython: Java編寫的解釋器
  • IronPython: .NET平臺的解釋器
  • PyPy: Python自己編寫的解釋器(雞生蛋,蛋生雞)

Jython?

如果能夠在JVM中直接執(zhí)行Python腳本,與Java業(yè)務(wù)代碼的交互自然是最簡單不過。但隨后的調(diào)研發(fā)現(xiàn),這條路很快就被堵死了:

  • 不支持Python3.0以上的語法
  • python源碼中若引用的第三方庫包含C語言擴(kuò)展,將無法提供支持,如numpy等

這條路行不通,那還有一條:把Python代碼轉(zhuǎn)換成Native代碼塊,Java通過JNI的接口形式調(diào)用。

Python -> Native代碼

整體思路

先將Python源代碼轉(zhuǎn)換成C代碼,之后用GCC編譯C代碼為二進(jìn)制模塊so/dll,接著進(jìn)行一次Java Native接口封裝,使用Jar打包命令轉(zhuǎn)換成Jar包,然后Java便可以直接調(diào)用。

Python代碼一鍵轉(zhuǎn)Jar包及Java調(diào)用Python新姿勢

流程并不復(fù)雜,但要完整實現(xiàn)這個目標(biāo),有兩個關(guān)鍵問題需要解決:

1.Python代碼如何轉(zhuǎn)換成C代碼?

終于要輪到本文的主角登場了,將要用到的一個核心工具叫:Cython

請注意,這里的Cython和前面提到的CPython不是一回事。CPython狹義上是指C語言編寫的Python解釋器,是Windows、Linux下我們默認(rèn)的Python腳本解釋器。

而Cython是Python的一個第三方庫,你可以通過pip install Cython進(jìn)行安裝。

官方介紹Cython是一個Python語言規(guī)范的超集,它可以將Python+C混合編碼的.pyx腳本轉(zhuǎn)換為C代碼,主要用于優(yōu)化Python腳本性能或Python調(diào)用C函數(shù)庫。

聽上去有點復(fù)雜,也有點繞,不過沒關(guān)系,get一個核心點即可:Cython能夠把Python腳本轉(zhuǎn)換成C代碼

來看一個實驗:

# FileName: test.py
def test_function():
 print("this is print from python script")

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站名稱:Python代碼一鍵轉(zhuǎn)Jar包及Java調(diào)用Python新姿勢-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://www.muchs.cn/article4/pisie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、建站公司、微信公眾號、做網(wǎng)站、網(wǎng)站設(shè)計公司、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站