解析Python扩展模块的加速方案
作者:燕山588 发布时间:2022-12-26 04:53:00
ctypes(一)
— 初识
很多初学Python的新手,总是嘴边挂着一句话:“Python是一门胶水语言”。
可是究竟什么是胶水语言呢?相信很多人都不知道,或者误以为胶水就是可以直接和其他所有语言配合的语言。
虽然如今Python已经发展得很强大了,“胶水语言”这个特性已经很少被提及了。但是胶水仍然是它现在应用得最广泛的特性之一。只不过从曾经Python为辅变成了如今的Python为主而已。
那么到底什么是“胶水特性”呢?
其实Python自打出生以来就和C语言有莫大的关联,它可以调用现有的C/C++程序,而不用做那些重复造轮子的事。使得节约了大量的重新开发的成本。许多的现有C程序代码可以用一个Python作为中枢来管理和调用,就好像这些C程序“被胶水粘住了”一样。这就是胶水特性的来源。
随着Python语言的发展,Python已经变得足够强大和健壮,在不断优化性能的过程中,胶水这一特性被逐渐弱化,因为Python已经强大到不需要依附C语言而存在。但是这一特性让然被保留了下来。那么,既然Python已经足够强大,那么还需要这一特性做什么呢?
说到底,Python是一个解释型动态脚本语言,再加上十几年没有解决的GIL锁,无论是执行效率还是并发性都是Python最大的缺点。
因此这个特性的存在给如今的Pythoner一个新的选择,那些对执行效率和并发性有着极高要求的模块,使用C来实现。使用C来辅助Python解决某些特殊情况下的性能问题,成了如今Python社区中最为普遍的方案,很多人不知道,事实上很多我们常用的库都利用了这一特性。
数据兼容层
由于Python这一特性是一个大家族,我们先来了解一下Python与C之间做的一个兼容层模块 — ctypes 模块。
了解 ctypes模块之前,我们需要先了解 ctypes 提供了哪些用于兼容的数据类型:
注:一下表格是根据Python3版本列出,区别仅仅是原生字符串类型和long整型而已
尝试共享库
什么是共享库?
其实C语言在经过编译之后不一定要生成可执行文件,可以以一种共享给其他程序调用的“共享库”的形式存在,其他程序通过调用这个共享库,就可以利用这个现有C编译过的程序了。
为了对各位新手朋友能够更加产生更加直接的帮助,我们以Windows系统为例,调用VC共享库。Windows下默认给VC共享库加上dll扩展名后缀。
我们以加载 cdecl 调用规则函数的 cdll 模块进行展示
首先,我们必须要导入 cdll 可以参考一下语句
from ctypes import cdll
然后可以直接通过对 cdll 的属性访问获得 msvcrt.dll 共享库文件的连接
libc = cdll.msvcrt
接着,我们就可以从这个共享库中获得相应的VC函数了,最常见的是printf函数(ps:不知道有没有引起一些老司机的眼泪呢?)
printf = libc.printf
既然已经拿到了一个共享库中的函数,那么我们就来牛刀小试一下吧
我们首先在IDLE里面试着运行一下
什么也没有发生!貌似被深深的欺骗了!别急,这其中自由原因。
我们先来看看,printf函数调用的结果是什么,使用print查看
看样子printf函数的返回值是输出的字节数,可是我们还有一个问题没有解决,那就是,输出在哪呢?
其实printf函数是C的函数,并不会输出到Python中来,因此要使用控制台来输出
是不是已经成功输出了?
在了解这些最基础的知识以后,我们就可以更加深入的去了解其中相关的规则,下次我们会具体介绍一些其中的规则,让你对这个库的使用更加得心应手。
来源:https://blog.csdn.net/kj7762/article/details/120239386


猜你喜欢
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 我们知道,dropout一般都在训练的时候使用,那么测试的时候如何也开启dropout呢?在pytorch中,网络有train和eval两种
- 首先,我们来看一个Python抓取网页的库:urllib或urllib2。那么urllib与urllib2有什么区别呢?可以把urllib2
- 目录前言1. 效果图2. 原理3. 源码3.1 Numpy实现傅里叶变换3.2 OpenCV实现傅里叶变换3.3 HPF or LPF?参考
- 最近在学习python的内容,在导入requsets库的时候遇到了问题。import requests查了一下资料是requests库需要安
- 列表添加元素append(),extend(),insert(),+list区别回忆初学python的时候,对列表list添加元素时,对类表
- 这篇文章主要介绍了python使用rsa非对称加密过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- TypeScript打包 webpack整合通常情况下,实际开发中我们都需要使用构建工具对代码进行打包;TS同样也可以结合构建工具
- 介绍RANGE分区基于一个给定的连续区间范围,早期版本RANGE主要是基于整数的分区。在5.7版本中DATE、DATETIME列也可以使用R
- 常用的网站性能测试指标有:并发数、响应时间、吞吐量、性能计数器等。1、并发数并发数是指系统同时能处理的请求数量,这个也是反应了系统的负载能力
- 看了一段时间关于js原型的知识,js的扩展方法是基于原型的,如Array.prototype.XXXX就是给Array扩展XXX方法,然后数
- 数据平台 Kaggle 近日发布了 2017 机器学习及数据科学调查报告,这也是 Kaggle 首次进行全行业调查。调查共收到超过 1600
- 在windows中罗技K380可以安装Logitech Options来实现这个Fn锁定功能。在linux中如何实现Logitech Opt
- 在Mysql中很多表都包含可为NULL(空值)的列,即使应用程序并不需要保存NULL也是如此,这是因为可为NULL是列的默认属性。但我们常在
- css可以处理16,777,216颜色,可以使用名字、rgb值或十六进制代码。red红色等同于 rgb(255,0,0) &nbs
- 一.引言先看获取到的效果拍摄时间:2021:12:18 16:22:13照片拍摄地址:('内蒙古自治区包头市昆都仑区', &
- 实现了简单版本的logging.config,支持一般的通过config文件进行配置。感觉还有更好的方法,是直接利用logging.conf
- 1、打开插件市场链接:ext.dcloud.net.cn/plugin?id=2…点击红色框按钮绑定包名,这个包名与后
- golang中的string是可以转换为byte数组或者rune数组但是其实byte对应的类型是uint8,而rune对应的数据类型就是in
- 用户体验(User Experience,简称UE)是用户在使用产品过程中建立起来的一种纯主观感受。在基于Web的产品设计中,UE是一个相对