梦见牙掉了,上海浦东发展银行,景甜男朋友-可爱精神,向不开心开战,开心文章、新闻,为你提供

频道:国内时事 日期: 浏览:126

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机器学习社区生长和昌盛。

热门
最新
推荐
标签