python函数调用的例子_Python案例|混用C函数

今天,我们来解决python的速度问题.我们平时所说的Python是指在PC机上的CPython,换句话说,Python的解释器是用C语言编写的。为Python编写C扩展模块能够显著提高Python的执行速度,眼下有好几种方案可以完成这件事。

u=2715897890,1078013361&fm=173&app=49&f=JPEG?w=640&h=274&s=B5A4F2150E981C431486D5910300E0A1

使用Python自带的 ctypes 模块在Python内直接调用C的动态链接库代码,这对于调用现有的库,一些不开源的库很有用.

用Python自带的c API来写模块,当然是用c/c++来编写

用 Cython 的新语法来写扩展模块,这种新语法看起来既像Python又像C,是个语法混合体,但还有很多人推崇, 其优点是可以同时调用C函数和Python函数。但其语法小编着实看着头大,有兴趣的可以自行研究.

用wsig, sip, boost.python等这些老派方法,他们都有各自的专门的要求,小编没用过,就不妄下评论了。

使用pybind11来写Python扩展模块。这个好东西小编一定说几句,很值得一看,它只有头文件,用些简单的写法就可以封装C/C++的代码,待编译出动态链接库后,Python可以直接导入使用,小编曾在Mac OSX系统上写过pyOF库,封装了一个开源C++库的一部分代码,后来就没有时间弄了。推荐pybind11啊,它用来封装C++非常方便,大家可以到网上搜索一下。

使用 cffi 模块。它本是pypy的一部分,pypy就是一个高速版Python,这个cffi也支持CPython, 它是ctypes的替代方案,在Python内写C代码和调用C动态库代码,但是比ctypes更方便,干净。

我们这里介绍的就是cffi, 它也是做 pyTorch 人工智能编程时官方推荐的使用方法。下面提供两段代码,分别是纯python编写,和使用cffi编写,算法都有一样,函数做10000次递归,在重复1000次。 对比一下他们的执行速度。

u=4245905642,1123445011&fm=173&app=49&f=JPEG?w=511&h=365&s=8772E532194A444D18FD00DA0000C0B2

u=3884557875,2691612096&fm=173&app=49&f=JPEG?w=496&h=411&s=0052C532110E454D4CD510DA0000C0B1

u=2477307510,2836959968&fm=173&app=49&f=JPEG?w=431&h=159&s=8F50E4128FC84D4318F451DB000010B0

以上代码是在 Ubuntu 16 ,python 2.7下测试. 我们可以看到这个例子中,使用cffi模块混入C 代码编程,使效率提升70倍,当然算法不同,参数不同都会引发对比结果的大幅变动,并不是绝对的,这个仅仅是给大家一个直观的感受.

从以上代码就可以看出来,我们仅仅是混合了两种语言,并不需要学习第三方的专有语法,就可以调用C代码。当然cffi不止这一种用法。这里只给出一个最为直观的用法, 它运行时会在后台调用c编译器。前提是你的机器上已经安装有C/C++编译器工具,python需安装cffi模块.

在众多方法中,网上有评测显示 cff i并不是最快速的方法. 最接近原生Pytohn C API的方法才是提速最快的方法,但使用 Pytohn C API 的方法实在是很麻烦地,所以说,根据不同的场景选择最合适的就是最好的。

对C语言,追求简单,上手快, 不用多学习, 懒人...... 我推荐 cffi, 对C++语言,第三方C++库, 我推荐 pybind11。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值