热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

今天,我们来解决python的速度问题.我们平时所说的Python是指在PC机上的CPython,换句话说,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。


推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
author-avatar
手机用户2602891927
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有