net能和python结合吗_如何不用安装python就能在.NET里调用Python库

前言

Pythonnet这个屌爆的项目的出现,使得我们可以用一种新的方式,让C#可以和Python之间进行互操作。但是它的设置和部署可能有点问题,真的是这样吗?

本文我会介绍Python.Included这个项目,它不但优雅的解决了这个问题,并且让.NET开发者可以轻松愉快的让.NET与Python进行互操作。作为概念的证明,我将使用Numpy.Net进行展示,它是一个.NET标准库,它为Python的Numpy提供了一个强类型API,并且使用它并不需要在Windows上安装Python。

开发人员从Numpy.NET的强类型API中获益,与动态API不同,后者支持Visual Studio的IntelliSense功能,可以显示原始的Numpy文档。

问题是什么?

每个人可能都安装了不同版本的Python,有一些人用Python 2.7,其他一些人用Python 3.5,3.6甚至3.7。当你使用pythonnet的时候,针对Python的每个小版本,它必须使用不同的配置进行编译,而且该版本的Python必须安装,这样代码才可以运行。所以如果你在团队里工作,每个人就必须配置完全相同的Python环境。但拿我们的SciSharp团队来说,情况就已经不是这样的了。如果你想部署你的.NET应用,你首先必须部署Python,从开发人员角度来讲,这很闹心。

然而,如果你正在搞机器学习和人工智能,尽管微软和SciSharp都付出了很大努力,但目前你还是无法完全避免Python的使用。如果你看一下正在使用pythonnet的项目的列表,你会发现很多AI领域的公司当前都在使用.NET与Python进行连接。

Python.Included 前来救援

如果你可以很简单的引用一个Nuget包,并在无需手动修改的情况下,一切都会自动的配置好,假如可以达到这种程度,你会感觉怎么样?这就是我创建Python.Included的愿景,Python.Included可以把packages python-3.7.3-embed-amd64.zip包含在它的程序集里,这这样就允许你可以通过Nuget来有效的引用Python了。为了证明它能正常工作,并可以快速提供所有的NumSharp中仍然缺少的Numpy功能,我创建了基于Python.Included的Numpy.NET这个项目。

概念验证:Numpy.NET

Numpy.NET为Numpy提供了强类型的包装函数,这意味着您完全不需要使用dynamic关键字,但这部分我会在另一篇文章中深入讨论。今天的重点是介绍 Numpy.NET 如何使用 Python.Included 来按需自动部署Python和Numpy以便对它们进行调用。

这是Numpy将在幕后实际执行的设置代码。这些都不需要你来操作。一旦你使用了它的一个函数:

var a = np.array(new [,] {{1, 2}, {3, 4}});,

Numpy.dll 就会设置好嵌入的Python发行版,而它是从你本机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也被导入进来了,可供后续使用。

PythonEngine.Initialize();

Py.Import("numpy");

这些都是在幕后发生的,使用Numpy.dll的用户根本不用担心本地的Python安装。事实上,即使您已安装了任何版本的Python也无所谓。

性能注意事项

大家都知道pythonnet比较慢,因此您可能会问自己,使用pythonnet将Python库与.NET接在一起是否真的是一个好主意。一如既往,这要看情况而定。

我的测试结果表明,与直接从Python调用Numpy相比,使用.net调用numpy的开销大约是它的4倍。需要澄清一下,这并不意味着Numpy.NET比python中的numpy慢四倍,这仅仅意味着通过pythonnet调用Numpy会有额外的开销。当然了,由于Numpy.NET调用的是Numpy,Numpy函数本身的执行时间是完全相同的。

开销是否是一个问题完全取决于实际用例。如果您在一个嵌套循环中不断的在CLR和Python之间来回切换,那就可能会遇到问题。但大多数Python库的设计都都是为了提高效率,避免数据循环。Numpy允许您只使用一个调用就可以对数百万的数组元素进行操作。Pytorch和Tensorflow允许您完全在GPU上执行操作。因此,如果正确使用,与处理大量数据时操作的执行时间相比,互操作开销可以忽略不计。

路线图

我知道现在有很多把Numpy移植到.NET上的方案和项目,例如使用IronPython。但是IronPython项目仍然只支持Python 2.7,而且项目进展非常缓慢。这就导致了依赖于python 3的库不能通过IronPython来获得和使用,而且这种情况在近期也不会有什么改变。

我的重点是通过pythonnet为.NET提供更多的机器学习和人工智能库。SciSharp团队也在讨论如何研发出一个更快版本的pythonnet,从而避免使用天性缓慢的DynamicObject。

请尝试一下Numpy.NET,并让我知道它为你做了什么并且做的如何。如果有任何意见或建议,我将不胜感激,我希望我的工作能够帮助.NET机器学习社区成长和繁荣。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spectral安装

Spectral Python (SPy) 是一个纯 Python 模块,用于处理高光谱图像数据。它具有读取、显示、操作和分类高光谱图像的功能。 SPy 需要 Python 并依赖于其他几个免费提供的 Python 模块。在安装 SPy 之前,您应该确保满足其依赖项。虽然您可以仅使用 Python…

打工是最愚蠢的投资——李嘉诚在深圳大梅沙演讲

打工是最愚蠢的投资——李嘉诚在深圳大梅沙演讲 很多人会认为打工并不是投资, 强烈反对这种观念。 其实打工才是最大 最愚蠢的投资。 人生最宝贵的是什么?除了我们的青春还有什么更宝 贵?很多人都抱怨我穷,我没钱想做生意又找不到…

windows远程桌面端口修改

远程桌面服务所使用的通信协议是Microsoft定义RDP(Reliable Data Protocol)协议,RDP协议的TCP通信端口号是3389。为了安全起见,我们常需要更改其端口。 运行注册表编辑器,找到HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal …

python将字典作为参数传入函数

示例 max_d {"scholl":123} print(*max_d) print(**max_d) 运行结果 scholl Traceback (most recent call last):File "D:/pythonProject1/test.py", line 3, in <module>print(**max_d) TypeError: scholl is an invalid keyword argument for …

wxpython图形_wxPython(Python的GUI图形库)v3.0.2.0免费版-独木成林

wxPython(Python的GUI图形库) v3.0.2.0免费版wxPython2.8-win32-ansi-py27 对应于32位 python 2.7版本.简单例子:#!/usr/bin/env pythonimport wxapp wx.App(False) # Create a new app, dont redirect stdout/stderr to a window.frame wx.Frame(None, wx.ID_ANY, "He…

epoll或者kqueue的原理是什么?

首先我们来定义流的概念&#xff0c;一个流可以是文件&#xff0c;socket&#xff0c;pipe等等可以进行I/O操作的内核对象。 不管是文件&#xff0c;还是套接字&#xff0c;还是管道&#xff0c;我们都可以把他们看作流。 之后我们来讨论I/O的操作&#xff0c;通过read&#xf…

SaaS窘境[欣赏然后翻译之]

Piaoger按&#xff1a; 还是SaaS窘境&#xff0c;只不过这次是翻译了一篇不错的英文Blog&#xff0c;翻译的过程很苦&#xff0c;有些地方至今也还觉得生涩&#xff0c;慢慢改吧。 不过怎么说&#xff0c;收获良多&#xff0c;无论是SaaS&#xff0c;还是Disruptive Innovation…

解决IDL检索COM类工厂中CLSID为{ }组件注册失败

作者用的envi版本为5.3 在第一次利用C#对IDL进行二次开发出现组件注册失败 解决方法&#xff1a; 亲测有效 以管理员的身份运行命令提示符 然后在文本框内输入即可解决 C:\Windows\System32\regsvr32.exe "D:\Program Files\Exelis\IDL85\resource\bridges\export\CO…

win7上安装wince6.0

先在 Win 7 上装 WinCE 6.0会出现如下问题&#xff1a; 1、ToolsMsmCA(Error): Setup package issue or CoreCon DataStore corrupted: CDeviceSDKInstallShim Add/Remove failed. HR0x8007005。 2、ToolsMsmCA(Error): Setup package issue or CoreCon DataStore corrupted…

(转载)DevExpress ASPxGridView 使用文档六:模板

转载请注明出处&#xff1a;http://surfsky.cnblogs.com/ ----------------------------------------------------------- ASPxGridView 模板---------------------------------------------------------ASPxGridView 提供以下几种自定义的模板视图 EditForm 编辑窗口。弹…

arcgis缓冲后在envi中聚类出错

问题&#xff1a; arcgis将某一矢量缓冲后&#xff0c;将非研究区的nodata值改为-9999&#xff0c;后在envi中聚类&#xff0c;发现只分成两类&#xff0c;研究区和非研究区 解决 将-9999改为nodata值这样非研究区就不会参与计算

python博客下载本地文件_解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了...

1.今天网上下载一个博客项目&#xff0c;发现本地访问,js,css加载不了.我想应该是项目上线的安全措施,但是我想调试项目.找到方法如下在settings.py里面编辑添加STATICFILES_DIRS (os.path.join(BASE_DIR, static),)另外把STATIC_ROOT os.path.join(BASE_DIR, static)改为STA…

centos smb配置与win7共享

1. 安装samba yum -y install samba 2. 修改samba配置文件 vi /etc/samba/smb.conf 增加一下内容&#xff1a; [global]        workgroup WORKGROUP        server string file Server        security share [share] …

Ubuntu开机自动启动script(2)

1.安装apt install chkconfig 2.用root帐号登录&#xff0c;vi /etc/rc.d/init.d/mystart&#xff0c;追加如下内容&#xff1a; #! /bin/shecho "hello start up script!" > /home/liaoyong/mystart.txtexit 0这个脚本的作用只是在我的家目录里建立一个文本文件&…

qr分解求线性方程组_梯度下降求解线性方程组算例设计

凸二次优化问题Theory. 设是实对称正定矩阵&#xff0c;&#xff0c;则求解凸二次优化问题等价于求解线性方程组。Proof. 二次型二阶可导&#xff0c;极小值点处梯度为零&#xff0c;现对优化的目标函数求梯度。二次型本质上具有&#xff1a;计算梯度的分量表达式&#xff1a;合…

dem聚类只能成为一类

将各个图层分类后在进行聚类

VMware下桥接设置

操作环境 主机&#xff1a;Win7 X86 SP1 虚拟机&#xff1a;VMware station 8 虚拟机里的系统&#xff1a;Fedora 15 环境上&#xff0c;不管什么系统&#xff0c;什么版本的虚拟机&#xff0c;使用上都是大同小异的&#xff0c;毕竟核心是不变的。 VM虚拟机下linux系统&am…

分享21个丰富多彩的 HTML5 小游戏

作为下一代的网页语言&#xff0c;HTML5 拥有很多让人期待已久的新特性。HTML5 的优势之一在于能够实现跨平台游戏编码移植&#xff0c;现在已经有很多公司在移动设备上使用 HTML5 技术。随着 HTML5 跨平台支持的不断增强和智能手机的迅速普&#xff0c;HTML5 技术有着非常好的…

python白森_氧气恋人

江白森002.发布于2019-07-18 13:37再次见到江白森的时候是三天后&#xff0c;也就是军训的第二天。晚间的时候&#xff0c;以小组为单位举行篝火晚会。修辞坐在树枝堆前&#xff0c;看着堆积的树枝霎时间被点燃&#xff0c;火光一瞬间炸裂&#xff0c;越来越旺。树堆那边的人像…