python结合c_Python加C,岂不美哉

引言

注意以下内容均为本人主观操作感受,运行环境为Win10+python3.7-32位,仅供本人日后查阅

众所周知,python是一门优美而简洁的编程语言,其最大的不足在于运行速度过于感人,而C语言作为最接近底层的高级语言,速度快是他最大的优势。python被誉为胶水语言,应该有办法和C语言胶和起来,我查阅资料发现python调用C语言最普遍的方式大概有三种:

1、将C语言的函数编译成dll动态链接库,然后通过python的ctypes模块对dll进行调用。

2、借由cython先将python代码编译成C语言代码,然后再讲C代码编译成.pyd文件直接在python中导入进行调用,cython本身有一定语法,不过不会一般也不太影响使用。

3、使用Swig可以将C代码直接封装成python代码,过程略为复杂,优点是可以为多种语言提供接口。

以上几种方法的原理和过程下图很好的解释了:图片来自网络

本文用斐波拉契函数为例,探究python和C的合璧之法。纯python代码

纯C语言代码

通过运行上面的代码可以得到运行时间:

纯python:计算结果:102334155

python time cost: 87.49325394630432

纯C语言:计算结果:102334155

C cost time:0.863000

差不多差了两个数量级吧。。。

1、通过ctypes调用dll

首先得先生成一个dll,你可以在ide里新建一个dll工程进行创建。更简单的做法是利用下面的gcc命令直接在cmd里进行编译,但前提是你已经装了Mingw或者并Mingw-w64且设置了环境变量,其中有个比较坑的地方就是你编译出来的dll位数要和你的python位数要匹配,像我笔记本上装的是Mingw-w64,而pyhton是32位的,32的python无法调用64位的dll,而这位Mingw-w64虽说同时支持64位和32位,但是前提是安装时勾选的是sjlj而不是seh,seh不支持32位!

安装Mingw建议用下面这位up的工具,简单快捷。

安装Mingw-w64可以参考:https://www.cnblogs.com/ggg-327931457/p/9694516.html

用于编译dll的c语言代码只需给出函数就好了:用于dll的C语言代码

下面是cmd中将C原文件编译成dll的命令:gcc -fPIC -shared name.c -o name.dll

如果是sjlj的Mingw-w64加上-m32可以编译出32位dll:gcc -fPIC -shared -m32 name.c -o name.dll

然后在python中导入ctypes模块就可以调用dll了:ctype的导入与使用

ctype调用dll运行时间:计算结果:102334155

python time cost: 0.9999649524688721

因为只有一个函数,还调用的是C语言的,所以速度和纯C差不多。

2、cython

先给出官方的一个教程:http://docs.cython.org/en/latest/src/tutorial/cython_tutorial.html

使用cython首先要安装cython模块:pip install Cython

然后你需要安装Mingw进行一番配置或者直接下载安装Visual Studio安装C++环境,因为我用的是Mingw-win64,所以自然就先抛弃后面那个巨无霸选用前者,一番尝试后发现还是Visual Studio真香。当然可能单纯的是因为Mingw-win64不支持而已,用Mingw的话应该是可以的(但愿)。

安装完环境后就可以直接把之前的纯python代码中的函数部分进行cython转换,不过需要现将其后缀名改为.pyx,然后需要再创建一个setup.py文件,其中写入代码:from distutils.core import setup

from Cython.Build import cythonize

setup(

ext_modules = cythonize("fibcy.pyx")

)

然后还是cmd中执行:python setup.py build_ext --inplace

这时应该会生成一个.pyd文件,这个文件本质和前面的dll应该差不多,可以通过import在python中使用:

cython的使用计算结果:102334155

python time cost: 15.108871698379517

可以看到即使是在没有使用任何cython语法的情况下,cython的加速能力也是令人惊叹的,运行速度提高了一个数量级左右!

3、Swig

同样先给出一个教程参考:https://www.e-learn.cn/content/python/678874

其实swig的原理和前面也差不多,但是过程更为复杂。首先当然要安装swig,下载解压后同样添加到系统环境变量。

然后要准备的有C语言源文件,一个.i文件,还有一个setup.py文件。fib.c源文件

fib.i文件

setup.py文件

最后在命令行运行setup.py:python setup.py build_ext --inplace

最后生成的文件中应该有一个python文件,可以直接进行调用,除此之外我发现还有一个.pyd文件,果然和前面的方法都差不多呢,导入运行方法也和之前相同。

运行结果:计算结果:102334155

python time cost: 0.6825790405273438

居然比纯C语言还要快!大概是因为去掉了计时模块的缘故,可能python的计时模块比C的要快?结果还是很匪夷所思呢?

总结

python调用c语言的三种方法中ctypes方法最简单,将C代码直接编译成dll即可使用,cython可以为现有的python代码加速,swig可以直接将C转换为python,就是有点麻烦,但速度是最快的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值