位置: 编程技术 - 正文

Python和C/C++交互的几种方法总结(python与c)

编辑:rootadmin

推荐整理分享Python和C/C++交互的几种方法总结(python与c),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python与c++交互,python和c++一起学会混淆吗,python与c,python能和c交互吗,python和c++一起学会混淆吗,python与c++对接,python与c,python与c++对接,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

python作为一门脚本语言,其好处是语法简单,很多东西都已经封装好了,直接拿过来用就行,所以实现同样一个功能,用Python写要比用C/C++代码量会少得多。但是优点也必然也伴随着缺点(这是肯定的,不然还要其他语言干嘛),python最被人诟病的一个地方可能就是其运行速度了。这这是大部分脚本语言共同面对的问题,因为没有编译过程,直接逐行执行,所以要慢了一大截。所以在一些对速度要求很高的场合,一般都是使用C/C++这种编译型语言来写。但是很多时候,我们既想使用python的简介优美,又不想损失太多的性能,这个时候有没有办法将python与C/C++结合到一起呢?这样在性能与速度要求不高的地方,可以用pyhton写,而关键的运算部分用C/C++写,这样就太好了。python在做科学计算或者数据分析时,这是一个非常普遍的需求。要想实现这个功能,python为我们提供了不止一种解决办法。

下面我就逐一给大家介绍。

一、Cython 混合python与C

官方网址: is a programming language that makes writing C extensions for the Python language as easy as Python itself. It aims to become a superset of the [Python]language which gives it high-level, object-oriented, functional, and dynamic programming. Its main feature on top of these is support for optional static type declarations as part of the language. The source code gets translated into optimized C/C++ code and compiled as Python extension modules. This allows for both very fast program execution and tight integration with external C libraries, while keeping up the high programmer productivity for which the Python language is well known.

简单来说,cython就是一个内置了c数据类型的python,它是一个python的超集,兼容几乎所有的纯python代码,但是又可以使用c的数据类型。这样就可以同时使用c库,又不失python的优雅。

好了,不讲太多废话,直接来看cython如何使用吧。这里的介绍大部分来自官网,由于cython涉及到的东西还比较多,所以这里只是简单的入门介绍,详细的信息请移步英文官网。

使用cython有两种方式:第一个是编译生成Python扩展文件(有点类似于dll,即动态链接库),可以直接import使用。第二个是使用jupyter notebook或sage notebook 内联 cython代码。

先看第一种。还是举最经典的hello world的例子吧。新建一个hello.pyx文件,定义一个hello函数如下:

然后,我们来写一个setup.py 文件(写python扩展几乎都要写setup.py文件,我之前也简单介绍过怎么写)如下:

其中 ext_modules 里面写你要 编译的.pyx文件名字。OK,所有工作都完成了。接下来,进入cmd,切换到setup.py 所在的文件,然后执行命令: python setup.py build_ext --inplace 就会编译生成一个build 文件夹以及一个.pyd文件了,这个pyd文件就是python的动态扩展库,--inplace 的意思是在当前文件目录下生成.pyd文件,不加这一句就会在build文件夹中生成。

截图如下:

图 1

可以看出,除了生成了一个pyd文件之外,还生成了一个.c文件。test.py是我们用来测试的文件,在里面写如下内容:

从hello 模块导入 hello函数,然后直接调用就可以了。结果输出 Hello lyric.

再来看如何 在 jupyter notebook中使用cython。如果你装过ipython,一个升级版的python交互式环境,你应该听过 ipyhton notebook的大名,现在它升级了,改名叫jupyter notebook 了。简单来说,这个就是一个可以在网页环境下交互式使用python的工具,不仅可以实时看到计算结果,还可以直接展示表格,图片等,功能还是非常强大的。首先你得安装jupyter notebook.我印象中安装了ipython之后应该就会带了jupyter了。如果没有,可以直接 pip install jupyter .然后输入命令 jupyter notebook 就会在浏览器中打开jupyter了。

如下图2 所示:

图 2

点击右上角的new按钮,可以选择新建一个文本文件或者文件夹,markdown或者python文件,这里我们选择新建一个pyhton 文件,然后就会转到一个新的窗口了,如下图3:

图 3

In[]:和ipython一样,就代表着我们要输入代码的地方,输入代码之后,点击向右的三角形符号,就会执行代码了。

Python和C/C++交互的几种方法总结(python与c)

首先输入 %load_ext cython ,然后执行,%开头的语句是jupyter的魔法命令,%是行命令,%%是单元命令,具体不多说,有空给大家专门介绍一下notebook的使用。

接下来输入:

%%cython 表明将cython内嵌到jupyter,cdef 是cython的关键字,用于定义c类型,这里将a定义为c中的int类型,并且初始化为0.

然后后面的循环就是累加0到9的意思,最后输出.

另外,我们如果想分析代码 的执行情况,可以输入 %%cython --annotate 命令,这样就可以输出结果的同时,也输出 详细的代码执行情况报告了。

截图如图4 所示:

图 4

jupyter notebook 可以内嵌cython,不用我们手写setup.py 文件,省去了编译的过程,方便了cython的使用,所以不是正式做项目,只是写一写小东西用jupyter+cython还是非常方便的。

前面提到了 cdef,再举一个稍微复杂点的例子吧。还是引用官网的例子,写一个算积分的函数.新建 integrate.pyx 文件,写入如下内容:

这段代码应该也是比较好理解的, f()函数是被积函数,a,b是积分的上下限,N是分割小矩形的个数,注意这里将 变量i,s,dx全部都用cdef 声明为c类型了,一般来说,在需要密集计算的地方比如循环或者复杂运算,可以将对应的变量声明为c类型,可以加快运行速度。

然后和上面一样编写 setup.py ,就是把 pyx的文件名改一下,代码我就不贴了。然后python setup.py build_ext --inplace 执行。得到pyd文件,编写测试文件test.py如下:

上面的代码,我们重新使用python写了一个积分函数py_integrate_f,与pyd中的integrate_f 函数进行运算对比,结果如下(图5):

图5

可以看出,使用了cython的版本比纯Python的版本大概快了4、5倍的样子,而这仅仅是将几个变量改为c类型的结果,可见,cython确实可以方便地对python与c进行混合,获得速度上的提升,又不失去Python的简洁优美。

最后再来说下cython 如何调用c libraries. C 语言 stdlib 库有一个 atoi函数,可以将字符串转化为整数,math库有一个sin函数,我们就以这两个函数为例。新建 calling_c.pyx 文件,文件内容如下:

前两行导入了C语言中的函数,然后我们自定义了两个函数,parse_char_to_int 可以将字符串转换为整数,f_sin_squared 计算 x平方的sin函数值。写 setup.py 文件,和之前差不多,但是要注意的是,在unix系统下,math库默认是不链接的,所以需要指明其位置,那么在unix系统下,setup.py 文件的内容就需要增加Extension 一项,如下:

然后直接编即可。test.py文件如下:

需要注意的是,Python字符串不能直接传入 parse_char_to_int 函数,需要将其转换为 bytes 类型再传入。运行结果为:

如果不想通过libc导入c语言模块,cython也允许我们自己声明c函数原型来导入,一个例子如下:

使用了 extern 关键字。

每次都编写setup.py 文件,然后编译,略显麻烦。cython还提供了一种更简单的方法:pyximport。通过导入pyximport(安装cython时会自动安装),在没有引入额外的c库的情况下,可以直接调用pyx中的函数,更为直接与方便。以前面的hello 模块为例,编写好hello.py文件之后,编写一个pyximport_test.py 文件,文件内容如下:

直接运行就会发现,确实可以正确导入hello模块。

cython的更多内容,请大家自行访问官网查看。

其他python与c/c++ 混合编程的方式主要还有 使用 ctypes,cffi模块以及swig。本来想一起写的,想想还是分开写吧,不然太长了。后续会陆续更新,敬请关注。

总结

标签: python与c

本文链接地址:https://www.jiuchutong.com/biancheng/375656.html 转载请保留说明!

上一篇:Python常用时间操作总结【取得当前时间、时间函数、应用等】

下一篇:python中nan与inf转为特定数字方法示例(python int 转 float)

  • 地方税概述?
  • 营运资产周转次数平均值
  • 加计扣除进项税账务处理
  • 小规模纳税人不动产租赁税率
  • 增值税改革后增值税申报表怎么填写
  • 签证费没有发票可以入账吗
  • 小规模建筑业如何做账
  • 网络公司可以开展什么业务
  • 出口免税进项税额转出会计分录
  • 应付账款暂估会计处理
  • 有限合伙企业jp
  • 发票开出来对方不走账会怎么样?
  • 购入债券计入什么科目
  • 小规模纳税人出租房屋增值税税率是多少
  • 外贸企业购买生产车辆
  • 公司一直零报税,有问题吗
  • 年终所得税汇算提示成本费用与实际取得发票有差异
  • 纳税等级信息查询
  • 资本金结汇资金用途
  • 结转实物发放的成本分录
  • 老总来公司视察
  • 个人工程款税怎么开
  • 认证费计入什么科目
  • 承兑兑现违法吗
  • 公司购买基金怎样入账
  • 去年的发票忘记入账怎么处理
  • 无形资产出租的账务处理
  • win10电脑c盘满了怎么转移到d盘
  • laravel多条件查询
  • 适用执行企业会计准则的一般企业
  • 企业内部转账通知单
  • 最新版本金铲铲强势阵容
  • 联邦学习攻击与防御综述
  • php路径问题
  • 期初成本和期末成本
  • 存货毁损计入什么科目
  • 购买农产品取得增值税普通发票可以抵扣吗
  • 帝国cms导航站模板
  • 物业会计账务处理大全
  • 外贸企业有哪些公司青岛
  • 已经提完折旧的房产价值评估
  • 民办非注销原因如何写
  • 合营企业和联营企业都是权益法吗
  • 个别计价法下,把每一种存货的实际成本
  • 交通运输行业属于什么性质
  • 单位举办活动
  • 行政单位应缴财政税金
  • 财务费用为什么是向债权人支付的现金流量
  • 收到投资款如何做账务处理
  • 关于母子公司的关系的表述,正确的是( )
  • 收到现金怎么做凭证
  • 外贸企业进项税转出怎么申报
  • 小微企业注册流程及注意事项
  • 研发费用辅助账模板 税务局
  • 工会经费会返还吗
  • 公司股东借款转私人账户
  • 待摊费用属于流动负债吗
  • 企业开了发票
  • mysql中的where子句
  • 虚拟机linux端mysql数据库无法远程访问的解决办法
  • SQL server 字符串函数
  • kvm虚拟机paused
  • 微软 win7
  • windows10 硬件
  • win7任务栏跑到右边了
  • win10内置应用大全
  • win8系统出现闪屏
  • android studio打包jar文件
  • unity碰撞抖动怎么解决
  • jquery的问题
  • python deque
  • 详解javascript事件冒泡
  • 简单Python代码
  • 发票查验平台可以查询自己给对方开的发票吗?
  • 小规模纳税人忘记作废发票导致超过免税范围
  • 审计如何聚焦主责主业
  • 小规模纳税人销售货物税率是多少
  • 查询完毕
  • 税务备案表付汇日期是否可以提前
  • 江苏电子税务局网址
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设