热门标签 | 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。


推荐阅读
  • PyTorch 2.0来了!100%向后兼容,一行代码将训练提速76%!
    点击下方卡片,关注“CVer”公众号AICV重磅干货,第一时间送达点击进入—CV微信技术交流群转载自:机器之心PyTorch官方 ... [详细]
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • 在将 Android Studio 从 3.0 升级到 3.1 版本后,遇到项目无法正常编译的问题,具体错误信息为:org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDemoProductDebugResources'。 ... [详细]
  • 实现系统调用
    实现系统调用一、实验环境​本次操作还是基于上次编译Linux0.11内核的实验环境进行操作。环境如下:二、实验目标​通过对上述实验原理的认识,相信 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • C语言是计算机科学和编程领域的基石,许多初学者在学习过程中会感到困惑。本文将详细介绍C语言的基本概念、关键语法和实用示例,帮助你快速上手C语言。 ... [详细]
  • 在OpenCV 3.1.0中实现SIFT与SURF特征检测
    本文介绍如何在OpenCV 3.1.0版本中通过Python 2.7环境使用SIFT和SURF算法进行图像特征点检测。由于这些高级功能在OpenCV 3.0.0及更高版本中被移至额外的contrib模块,因此需要特别处理才能正常使用。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 汇编语言:编程世界的始祖,连C语言都敬畏三分!
    当C语言还在萌芽阶段时,它首次接触到了汇编语言,并对其简洁性感到震惊。尽管汇编语言的指令极其简单,但它却是所有现代编程语言的基础,其重要性不言而喻。 ... [详细]
  • 深入理解云计算与大数据技术
    本文详细探讨了云计算与大数据技术的关键知识点,包括大数据处理平台、社会网络大数据、城市大数据、工业大数据、教育大数据、数据开放与共享的应用,以及搜索引擎与Web挖掘、推荐技术的研究及应用。文章还涵盖了云计算的基础概念、特点和服务类型分类。 ... [详细]
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • 本文介绍了如何利用X_CORBA实现远程对象调用,并通过多个示例程序展示了其功能与应用,包括基础的Hello World示例、文件传输工具以及一个完整的聊天系统。 ... [详细]
  • 编译原理中的语法分析方法探讨
    本文探讨了在编译原理课程中遇到的复杂文法问题,特别是当使用SLR(1)文法时遇到的多重规约与移进冲突。文章讨论了可能的解决策略,包括递归下降解析、运算符优先级解析等,并提供了相关示例。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 最近遇到了一道关于哈夫曼树的编程题目,需要在下午之前完成。题目要求设计一个哈夫曼编码和解码系统,能够反复显示和处理多个项目,直到用户选择退出。希望各位大神能够提供帮助。 ... [详细]
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社区 版权所有