Pythonnet這個屌爆的項目的出現(xiàn),使得我們可以用一種新的方式,讓C#可以和Python之間進(jìn)行互操作。但是它的設(shè)置和部署可能有點問題,真的是這樣嗎?
成都創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、成都網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)平輿,十載網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
本文我會介紹Python.Included這個項目,它不但優(yōu)雅的解決了這個問題,并且讓.NET開發(fā)者可以輕松愉快的讓.NET與Python進(jìn)行互操作。作為概念的證明,我將使用Numpy.Net進(jìn)行展示,它是一個.NET標(biāo)準(zhǔn)庫,它為Python的Numpy提供了一個強(qiáng)類型API,并且使用它并不需要在Windows上安裝Python。
開發(fā)人員從Numpy.NET的強(qiáng)類型API中獲益,與動態(tài)API不同,后者支持Visual Studio的IntelliSense功能,可以顯示原始的Numpy文檔。
每個人可能都安裝了不同版本的Python,有一些人用Python 2.7,其他一些人用Python 3.5,3.6甚至3.7。當(dāng)你使用pythonnet的時候,針對Python的每個小版本,它必須使用不同的配置進(jìn)行編譯,而且該版本的Python必須安裝,這樣代碼才可以運行。所以如果你在團(tuán)隊里工作,每個人就必須配置完全相同的Python環(huán)境。但拿我們的SciSharp團(tuán)隊來說,情況就已經(jīng)不是這樣的了。如果你想部署你的.NET應(yīng)用,你首先必須部署Python,從開發(fā)人員角度來講,這很鬧心。
然而,如果你正在搞機(jī)器學(xué)習(xí)和人工智能,盡管微軟和SciSharp都付出了很大努力,但目前你還是無法完全避免Python的使用。如果你看一下正在使用pythonnet的項目的列表,你會發(fā)現(xiàn)很多AI領(lǐng)域的公司當(dāng)前都在使用.NET與Python進(jìn)行連接。
如果你可以很簡單的引用一個Nuget包,并在無需手動修改的情況下,一切都會自動的配置好,假如可以達(dá)到這種程度,你會感覺怎么樣?這就是我創(chuàng)建Python.Included的愿景,Python.Included可以把packages python-3.7.3-embed-amd64.zip包含在它的程序集里,這這樣就允許你可以通過Nuget來有效的引用Python了。為了證明它能正常工作,并可以快速提供所有的NumSharp中仍然缺少的Numpy功能,我創(chuàng)建了基于Python.Included的Numpy.NET這個項目。
Numpy.NET為Numpy提供了強(qiáng)類型的包裝函數(shù),這意味著您完全不需要使用dynamic關(guān)鍵字,但這部分我會在另一篇文章中深入討論。今天的重點是介紹 Numpy.NET 如何使用 Python.Included 來按需自動部署Python和Numpy以便對它們進(jìn)行調(diào)用。
這是Numpy將在幕后實際執(zhí)行的設(shè)置代碼。這些都不需要你來操作。一旦你使用了它的一個函數(shù):
var a = np.array(new [,] {{1, 2}, {3, 4}});,
Numpy.dll 就會設(shè)置好嵌入的Python發(fā)行版,而它是從你本機(jī)home目錄里的程序集里解壓縮出來的(如果還沒安裝過的話)。
var installer = new Python.Included.Installer(); installer.SetupPython(force:false).Wait();
下一步(如果在之前的運行中還沒完成)它將解壓縮 numpy pip wheel,而numpy pip wheel 是作為嵌入的資源打包到了Numpy.dll里的并其安裝到了Python安裝文件里。
installer.InstallWheel(typeof(NumPy).Assembly, "numpy-1.16.3-cp37-cp37m-win_amd64.whl").Wait();
最后,pythonnet運行時被初始化了,Numpy也被導(dǎo)入進(jìn)來了,可供后續(xù)使用。
PythonEngine.Initialize(); Py.Import("numpy");
這些都是在幕后發(fā)生的,使用Numpy.dll的用戶根本不用擔(dān)心本地的Python安裝。事實上,即使您已安裝了任何版本的Python也無所謂。
大家都知道pythonnet比較慢,因此您可能會問自己,使用pythonnet將Python庫與.NET接在一起是否真的是一個好主意。一如既往,這要看情況而定。
我的測試結(jié)果表明,與直接從Python調(diào)用Numpy相比,使用.net調(diào)用numpy的開銷大約是它的4倍。需要澄清一下,這并不意味著Numpy.NET比python中的numpy慢四倍,這僅僅意味著通過pythonnet調(diào)用Numpy會有額外的開銷。當(dāng)然了,由于Numpy.NET調(diào)用的是Numpy,Numpy函數(shù)本身的執(zhí)行時間是完全相同的。
開銷是否是一個問題完全取決于實際用例。如果您在一個嵌套循環(huán)中不斷的在CLR和Python之間來回切換,那就可能會遇到問題。但大多數(shù)Python庫的設(shè)計都都是為了提高效率,避免數(shù)據(jù)循環(huán)。Numpy允許您只使用一個調(diào)用就可以對數(shù)百萬的數(shù)組元素進(jìn)行操作。Pytorch和Tensorflow允許您完全在GPU上執(zhí)行操作。因此,如果正確使用,與處理大量數(shù)據(jù)時操作的執(zhí)行時間相比,互操作開銷可以忽略不計。
我知道現(xiàn)在有很多把Numpy移植到.NET上的方案和項目,例如使用IronPython。但是IronPython項目仍然只支持Python 2.7,而且項目進(jìn)展非常緩慢。這就導(dǎo)致了依賴于python 3的庫不能通過IronPython來獲得和使用,而且這種情況在近期也不會有什么改變。
我的重點是通過pythonnet為.NET提供更多的機(jī)器學(xué)習(xí)和人工智能庫。SciSharp團(tuán)隊也在討論如何研發(fā)出一個更快版本的pythonnet,從而避免使用天性緩慢的DynamicObject。
請嘗試一下Numpy.NET,并讓我知道它為你做了什么并且做的如何。如果有任何意見或建議,我將不勝感激,我希望我的工作能夠幫助.NET機(jī)器學(xué)習(xí)社區(qū)成長和繁榮。
文章名稱:無需安裝Python,就可以在.NET里調(diào)用Python庫
本文網(wǎng)址:http://www.rwnh.cn/article10/ipcgdo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)站導(dǎo)航、網(wǎng)站排名、外貿(mào)建站、自適應(yīng)網(wǎng)站、營銷型網(wǎng)站建設(shè)
聲明:本網(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)