python深入和扩展_加速方案 — Python扩展模块

原标题:加速方案 — Python扩展模块

ctypes(一)— 初识

这章我们介绍Python的扩展名之ctypes,教大家认识ctypes。喜欢Python的读者们可以加Python学习交流群:579817333 让我们共同进步!

很多初学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学习交流 579817333

数据兼容层

由于Python这一特性是一个大家族,我们先来了解一下Python与C之间做的一个兼容层模块 — ctypes 模块。

了解 ctypes模块之前,我们需要先了解 ctypes 提供了哪些用于兼容的数据类型:

注:一下表格是根据Python3版本列出,区别仅仅是原生字符串类型和long整型而已

ctypes 类型

c 类型

Python 类型

c_bool

_Bool

bool(1)

c_char

char

一个字符的bytes

c_wchar

wchar_t

一个字符的string

c_byte

char

int

c_ubyte

unsigned char

int

c_short

short

int

c_ushort

unsigned short

int

c_int

int

int

c_uint

unsigned int

int

c_long

long

int

c_ulong

unsigned long

int

c_longlong

__int64 或 long long

int

c_ulonglong

unsigned __int64 或 unsigned long long

int

c_size_t

size_t

int

c_ssize_t

ssize_t 或 Py_ssize_t

int

c_float

float

float

c_double

double

float

c_longdouble

long double

float

c_char_p

char * (NUL terminated)

string 或 None

c_wchar_p

wchar_t * (NUL terminated)

string 或 None

c_void_p

void *

int 或 None

尝试共享库

什么是共享库?

其实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

既然已经拿到了一个共享库中的函数,那么我们就来牛刀小试一下吧

大家有什么不懂的或者不会的可以加群 python学习交流 579817333

我们首先在IDLE里面试着运行一下

什么也没有发生!貌似被深深的欺骗了!别急,这其中自由原因。

我们先来看看,printf函数调用的结果是什么,使用print查看

看样子printf函数的返回值是输出的字节数,可是我们还有一个问题没有解决,那就是,输出在哪呢?

其实printf函数是C的函数,并不会输出到Python中来,因此要使用控制台来输出

是不是已经成功输出了?

在了解这些最基础的知识以后,我们就可以更加深入的去了解其中相关的规则,下次我们会具体介绍一些其中的规则,让你对这个库的使用更加得心应手。

大家有什么不懂的或者不会的可以加群 python学习交流 579817333 群里有大量的关于Python的视频学习资料返回搜狐,查看更多

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 切面_实用|AOP切面编程手段大汇总

点击上方"欧学长的架构成长之路" 关注我前言首先说一下什么是AOP?AOP就是面向切面编程,它是一个思想,通过切面,我们可以将那些反复出现的代码抽取出来,放在一个地方统一处理,提高代码的复用性。A…

php可以控制硬件吗,控制面板的作用是设置硬件接口吗?

错误,控制面板的作用是对系统进行有关的设置。控制面板是一个系统文件夹,用来提供各种对计算机系统进行设置和管理的工具;使用控制面板可以对系统进行设置与管理,例如设置系统环境参数的默认值和属性,添加新的应用程序…

python dict保存到文件_将dict写入txt文件并将其读回?

我正试着把字典写成一个txt文件。然后用raw_input键入键来读取dict值。我觉得我只是错过了一步,但我已经找了一段时间了。我知道这个错误File "name.py", line 24, in readingprint whip[name]TypeError: string indices must be integers, not str我的代…

不知道工作组名称怎样加入_剩米饭不知道怎样做?试试泡菜炒饭,再也不用担心米饭做多了...

剩米饭不知道怎样做?试试泡菜炒饭,再也不用担心米饭做多了东北的朋友这几天连续经历了春天,初夏和冬天,甚至在一天中看到了雪、雨和冰雹。这变化莫测的天气让大家一时间慌了神,不知到底要穿些什么。由于楼上都已经停了…

php元素浮动会产生哪些影响,css浮动带来什么问题

css浮动带来的影响:1、由于浮动元素脱离了文档流,所以父元素的高度无法被撑开,影响了与父元素同级的元素;若没有给父元素设置高度,那么父元素就不会在显示屏上显示。2、浮动元素不再占用原文档流的位置,它会…

pointnet分割自己的点云数据_细嚼慢咽读论文:PointNet论文及代码详细解析

论文标题:PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation标签:有监督 | 特征学习、点云分类、语义分割首先回答3个问题作为引子:Q1:什么是点云?简单来说就是一堆三维点的集合&#xf…

linux将字符串转小写_小猿圈总结Linux常见命令(一)

科技发展的今天,互联网不断的发达,很多人学习Linux云计算的时候回因为记不住一些命令从而去找度娘,有时候因为因为找不到linux的命令而烦恼,下面是小猿圈linux讲师给大家总结的linux常见命令,希望对你有所帮助。1、cd命…

java声明arraylist,在java构造函数中声明ArrayList

我正在研究一个项目,并且我被教导在构造函数中实例化变量.我在使用ArrayList思想时遇到了一些麻烦.您能否提出一些最佳实践,我是否需要使用实例变量定义ArrayList,或者我可以在构造函数中执行此操作.谢谢你的建议!我有一个我正在谈论的内容的例子://impo…

eureka 集群失败的原因_Eureka集群的那些坑

今天遇到一个Eureka集群的一个坑。问题现场类似是这样的:两台Eureka组成的服务注册中心集群,两台服务提供方server1、server2,两个服务调用方client1、client2。正常的情况下:client1和client2通过服务中心获取的服务提供方的注册…

cnpm安装webpack_Webpack(一)介绍

一、Webpack是什么、为什么要使用它简单来说,Webpack是一个打包工具。站在2018年的角度,成为一个优秀的前端工程师,除了要会写页面样式和动态效果之外,还需要会用主流的单页面框架、Node.js、简单的前端的性能优化等等。加上现在一…

php生日验证,PHP验证生日

function pc_checkbirthdate($month, $day, $year) {$min_age 18; // 过18岁$max_age 100; // 超过122岁// 验证是不是合法时间,不会出现2月30号类似错误if (! checkdate ( $month, $day, $year )) {return false;}// 取得当前 年 月 日list ( $this_year, $this_…

python中的try与if,python中if和try的区别是什么

python中if和try的区别是什么发布时间:2020-09-10 10:04:05来源:亿速云阅读:85作者:小新这篇文章给大家分享的是有关python中if和try的区别是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看…

bytes数组转string指定编码_一篇文章弄懂Python中所有数组数据类型

前言数组类型是各种编程语言中基本的数组结构了,本文来盘点下Python中各种“数组”类型的实现。listtuplearray.arraystrbytesbytearray其实把以上类型都说成是数组是不准确的。这里把数组当作一个广义的概念,即把列表、序列、数组都当作array-like数据类…

怎么安装php模板,PHPWind八风格模板的安装及制作教程

PHPWind八风格模板的安装及制作教程 PHPWind 8风格模板的安装及制作教程一、PHPWind风格模板的安装:1、下载自己喜欢的PHPWind模板,由于PHPWind使用者众多,所以为了符合多种客户的需要,它的风格模板也是有万千种风格,大…

sklearn保存svm分类模型_【菜菜的sklearn】07 支持向量机(上)

小伙伴们大家好~o( ̄▽ ̄)ブ,我是菜菜,这里是我的sklearn课堂第7期,今天分享的内容是支持向量机(上),下周还有下篇哦~我的开发环境是Jupyter lab,所用的库和版本大家参考&a…

cef在android中使用_关于富文本在Android中的应用以及遇到的坑

富文本可以为用户提供更加多样化的文本展示形式,但由于其使用了H5标签的特殊性,一般都需要第三方框架的支持。这里推荐一款合适的第三方富文本框架,richeditor。首先我们要使用该功能需要引入相关jar包,引入方法如下compile jp.wa…

thinkphp中如何使用PHP函数,如何在ThinkPHP中使用函数进行回调

如何在ThinkPHP中使用函数进行回调发布时间:2020-12-23 15:11:45来源:亿速云阅读:85作者:Leah本篇文章为大家展示了如何在ThinkPHP中使用函数进行回调,内容简明扼要并且容易理解,绝对能使你眼前一亮&#x…

unity 敌人自动攻击和寻路_Unity暑期萌新入门:环境篇

大家好,新一期又跟大家见面了。上一节我们完成了角色的移动控制,然而John只能在空白的场景中移动。因此接下来这一节我们将添加关卡、调节光照,让John来到阴森的鬼屋。然后设置NavMesh(导航网格,现在先听个概念就好),为…

layui tree 加载慢_图片太多,加载慢,我用了layui里的方式,放在服务器后还是太慢!怎么解决???有没有什么优化的技巧???...

怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决怎么解决???????layui.use([layer,flow], function(){v…

oracle 存储中文 u码,Oracle 汉字 占位

遇到了一个数据插入长度过长问题,记得大学时候,还说过oracle的不同编码下的的大小分配不是一样的,具体也忘记了,补上,以防下次犯二1 step先查看自己的oracle是什么字符集select userenv(language) from dual比如: SIMPLIFIED CHINESE_CHINA.ZHS16GBK 、 SIMPLIFIED CHINESE_CH…