解析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
猜你喜欢
- 本文实例讲述了python简单猜数游戏。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/env pythonimport ra
- 说到Javascript的类继承,就必然离不开原型链,但只通过原型链实现的继承有着不少缺陷。无参数类继承的问题先看一段示例代码,实现B继承于
- 通过urllib2、re模块抓种子思路1.用程序登录论坛(如果需要登录才能访问的版块)2.访问指定版块3.遍历帖子(先取指定页,再遍历页面所
- 引言:在机器学习还有深度学习中,经常会用到这几个函数,为了便于以后熟练使用,现在对这几个函数进行总结。(一)np.random.rand()
- MySQL 客户端连接成功后,通过 show [session|global]status 命令 可以提供服务器状态信息,也可以在操作系统上
- 有向无环图拓扑排序是针对有向无环图(DAG, Directed Acyclic Graph)的具有以下性质:如果这个图不是 DAG,那么它是
- 一、汉诺塔问题1. 问题来源问题源于印度的一个古老传说,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄
- 网页链接:https://www.huya.com/g/4079 这里的主要步骤其实还是和我们之前分析的一样,如下图所示:这里再简单带大家看
- 废话就不多说了,直接上内容。<form action="/home/search" method="ge
- 本文实例讲述了Python筛选及提取序列中元素的方法。分享给大家供大家参考,具体如下:问题:提取出序列中的值或者根据某些标准对序列做删减解决
- PERCONA PERFORMANCE CONFERENCE 2009上,来自雅虎的几位工程师带来了一篇”Efficient Paginat
- excel 文件内容如下:读取excel内容:import xlrdfrom datetime import datetimefrom xl
- 一、数据无量纲化处理 (热力图)1.数据无量纲化处理(仅介绍本文用到的方法):min-max归一化该方法是对原始数据进行线性变换,
- //符号是什么意思Python中的//是向下取整的意思a//b,应该是对除以b的结果向负无穷方向取整后的数举例:5//2=2(2.5向负无穷
- 本文实例为大家分享了python实现txt文件格式转换为arff格式的具体代码,供大家参考,具体内容如下将文件读取出来的时候默认都是字符型的
- 想学习Python3,但是暂时又离不开Python2。在Windows上如何让它们共存呢?目前国内网站经常会让大家把其中一个python.e
- 惊现!表面下的隐藏信息——浅谈信息可视化1910年,病卧床上的魏格那(德国气象学家,以“大陆漂移学说”闻名),无意地注视着墙上的世界地图……
- 本文实例为大家分享了基于TensorFlow的CNN实现Mnist手写数字识别的具体代码,供大家参考,具体内容如下一、CNN模型结构输入层:
- 日志级别CRITICAL 50ERROR 40WARNING 30INFO 20DEBUG 10logging.basicConfig()函
- 导语哈喽铁汁们好久不见吖~小编已经复工了于是马不停蹄赶来给大家准备新年礼物算开工礼物吧!海龟来作图虎年就是要画老虎2022不用纸和笔~今晚画