Python使用.NET开发的类库来提高你的程序执行效率(包括.NET Framework、.NET Standard、.NET CORE+环境)
Python由于本身的特性原因,执行程序期间可能效率并不是很理想。在某些需要自己提高一些代码的执行效率的时候,可以考虑使用C#、C++、Rust等语言开发的库来提高python本身的执行效率。接下来,我演示一种使用.NET平台开发的类库,来演示一下Python访问.NET类库的操作实现。类库演示包括.NET Framework、.NET Standard、.NET CORE+环境。
先安装pythonnet库

首先测试.net framework库能不能成功。创建一个.net framework的类库项目

开发一个测试类,代码如图所示,提供一个方法来输出“这是一个.net framework库的调用返回值”

编译以后,生成的dll拷贝到我的D盘的MyDlls文件夹内备用

创建一个python项目,调用.NET库需要先引入clr,clr.AddReference()里面添加你的类库地址。instance = FxTest();写法相当于你用C# 代码:var instance = new FxTest();来实例化一个对象。

运行Python程序,可以看到.net fx类库的方法被成功调用并返回。

测试.net standard项目。新建一个.net standard2.1的项目

开发两个类,一个用来给Python程序调用,一个是最终实现。

编译以后,也把类库文件丢之前的文件夹内备用。

改造下刚才的python代码,引用新的.net standard开发的类库,并运行python代码,也可以被成功调用。

再测试下.net core或以上类库环境。此处创建一个.net 8类库项目

同样的,也新建一个测试类,并且提供一个方法给python使用。该方法比前面测试案例多了一个参数输入。

编译以后,也丢上面用到的文件夹内测试用。

继续改造python代码,并运行,发现出错。

对刚才的.net8类库项目降级为.net6,再重新编译,然后替换到之前的测试用文件夹内。

再重新执行python程序,可以看到被成功调用了。说明截止目前,pythonnet只支持到.net6或者也可能到7,7不是LTS版本我就不测试了,但是.net 6是妥妥可以运行,那就代表.net 6、.net 5、netcore3.1以及netcore3.1以下版本都是可以被支持的了。

能够使用.NET来实现一些操作给python调用的好处是,可以提高python的一些运行效率。原生python执行效率毕竟可能尴尬一点点。
下面写一个例子来测试下效率差异。在netstandard类库里面新增一个累加方法:

Python里面写一个计时器,用来对执行方法的计时使用。

python里面也新增一个累加器方法,并且对两个方法都套上上面的计时器,用于测试耗时开销。

运行程序,查看执行结果,10000次运行,python耗时0.000997s,.NET库内的操作耗时约等于0秒

看不出太大效果,那就加到1000w次,得到的耗时相差,差不多147倍数。

再增大一些,1Y次,性能和上面1KW次比值基本上差不多,157倍数,取个中间值,相当于150倍性能差距。

上面这个只是使用.net standard2.1环境,如果使用更高版本的.net类库环境,估计还会更加拉大差距。本机的python环境版本为python 3.10.6。

以上就是本文章全部内容,如果对你有帮助,欢迎关注我的个人公众号:【Dotnet Dancer】
如果以上文章内容无法访问或者图片丢失,可以观看我的公众号原文文章:
https://mp.weixin.qq.com/s/ABlHCDmu7yLE7_aI2Z8sIA
2024-06-17 10:31:12【出处】:https://www.cnblogs.com/weskynet/p/18251383
=======================================================================================
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/18251897
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
2023-06-17 MobaXterm常用使用功能设置
2021-06-17 最简单入门深度学习
2021-06-17 机器学习基本流程
2021-06-17 Vue.js源码解析-Vue初始化流程
2021-06-17 最大公约数&最小公倍数
2020-06-17 单元测试的艺术 -- 系列文章(附测试代码)
2020-06-17 Oracle根据已经存在的数据生成INSERT语句