前言

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机器学习社区成长和繁荣。

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

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

  1. 查看Python的版本_查看当前安装Python的版本

    一.查看Python的版本_查看当前安装Python的版本 具体方法: 首先按[win+r]组合键打开运行: 然后输入cmd,点击[确定]: 最后执行[python --version]命令即可. 特 ...

  2. .net安装_无需安装Python,就可以在.NET里调用Python库

    作者 |  Meinrad Recheis 译文来源  |  草根专栏(ID:Cgzl-Tech) Pythonnet这个屌爆的项目的出现,使得我们可以用一种新的方式,让C#可以和Python之间进行 ...

  3. python 取反_自从用了这招pandas 空数据处理方法,python编程速度提升了不少

    今天为大家带来的内容是:自从用了这招pandas 空数据处理方法,python编程速度提升了不少 文章内容主要介绍了pandas 空数据处理方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工 ...

  4. python 预测算法_通过机器学习的线性回归算法预测股票走势(用Python实现)

    本文转自博客园,作者为hsm_computer 原文链接:https://www.cnblogs.com/JavaArchitect/p/11717998.html在笔者的新书里,将通过股票案例讲述P ...

  5. python open函数_精选2个小例子,带你快速入门Python文件处理

    阅读本文大概需要7分钟讲完了函数和模块,我们来讲一讲文件的使用,python对数据的处理分两种一种是本地文件的处理,另外一种是通过网络数据处理(也就是爬虫相关的).而本地的数据处理,主要是通过文件的读 ...

  6. python爱心代码_「含蓄优雅表白神器」程序员式用python代码画爱心(附详细教程)...

    还能用python代码画爱心?还有这种操作?这是什么原理? 不相信python代码可以画爱心?先来一张效果图来看看效果吧! 用python代码画爱心的思路是怎样的? 1.怎么画心形曲线 2.怎么填满心 ...

  7. python本科生就业_准备报学习机构学习大数据、Java或者python,是计算机专业的本科生,请问选择哪种就业发展比较好?...

    谢邀.对比java和python后者还算是小语种.不知道楼主的具体情况如何.根据个人情况,建议先学java,毕竟你目前的需求是尽快找到更合适的技术工作,java择业面相对较宽,虽然也难学,但学习资源丰 ...

  8. python画菊花_网传“菊花厂月薪13K”15道硬核Python面试题,值得一看!

    见过面试题也不少了,总之了一句话:面试前备好功课,面试中临危不乱,面试后谦虚有礼!这只是我本人总结的一些面试三要素,需要的可以参考参考,话不多了,今天为大家找了网传菊花厂比较硬核的15道面试题,希望能 ...

  9. python文件转换成jar包_Python一键转Jar包,Java调用Python新姿势!

    粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文.言归正传,咱们开始吧! 今天的这篇文章,聊一个轩辕君之前工作中遇到的需求:如何在Jav ...

最新文章

  1. mybatis-generator修改源码2
  2. linux系统指令学习
  3. 安卓拒绝服务漏洞分析及漏洞检测
  4. [论文阅读] Active Image Segmentation Propagation
  5. vlan 动态ospf综合网络配置
  6. junit测试一个方法,报test class not found in selected project
  7. 【直观详解】信息熵、交叉熵和相对熵
  8. 发现一个特给力的编写HTML/CSS的插件——Zen Coding
  9. ES6阮一峰读书笔记第三章字符串的拓展
  10. 什么是数字式射频信号发生器
  11. react如何获取input值_react中怎么获取input的值?
  12. 【壮丽70年·奋斗新时代】宿州:从农业大市转身为“中国云都”
  13. 程序员代码中的希腊字母表示
  14. register hotkey
  15. unity中计算不规则模型的体积与表面积—三角面片与四面体
  16. 1032 挖掘机技术哪家强 (20 分)
  17. 设计师都在用的宝藏网站,你一定要知道
  18. 语义分析- C-- 语言
  19. 动画函数封装 —— 筋头云图案跟随鼠标移动
  20. PC客户端(C/S架构)测试点整理

热门文章

  1. [IOI2018] werewolf 狼人
  2. stringstream字符串流的妙用
  3. HDU5923-Prediction-有继承味道的并查集
  4. EntityFramwork常见问题
  5. 时钟抖动对高速ADC采样系统的影响
  6. loadrunner学习理论之一
  7. java集合类分析-hashset
  8. 30 个很棒的 PHP 开源 CMS 内容管理系统
  9. 关于C#程序调用AMFPHP服务的问题!!
  10. [剑指offer][JAVA]面试题第[21]题[调整数组顺序使奇数位于偶数面前][双指针]