原标题:加速方案 — 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的视频学习资料返回搜狐,查看更多

责任编辑:

python深入和扩展_加速方案 — Python扩展模块相关推荐

  1. 用python做鹦鹉螺图_加速鹦鹉螺Python阅读图像的Exi

    我已经编写了一个Nautilus扩展来读取picture的元数据(执行exiftool),但是当我打开包含许多文件的文件夹时,它确实会减慢文件管理器的运行速度并挂起,直到它读取完文件的数据.在 有没有 ...

  2. 我的python学习之路_我的Python学习之路

    简单算来,接触Python有些时日了.想要做个简单的总结,算是为想要入门Python的童鞋做一个简单的介绍吧. 什么是Python Python,是一种面向对象.直译式的计算机程序语言.它包含了一组功 ...

  3. python模块下载过程_常用的python模块及安装方法

    bsddb3:BerkeleyDB的连接组件 Cheetah-1.0:我比较喜欢这个版本的cheetah cherrypy:一个WEB framework ctypes:用来调用动态链接库 DBUti ...

  4. python指定返回类型_如何在python中指定方法返回类型列表 - python

    假设我有一个类似下面的方法 def validate(self, item:dict, attrs:dict)-> list: 如果我想更具体一点,告诉我我的返回类型是 验证消息? 我应该如何实 ...

  5. python gil全局锁_什么是Python全局解释器锁(GIL)?

    python gil全局锁 The Python Global Interpreter Lock or GIL, in simple words, is a mutex (or a lock) tha ...

  6. python模块下载地址_常用的python模块功能和下载地址

    adodb:我们领导推荐的数据库连接组件 bsddb3:BerkeleyDB的连接组件 Cheetah-1.0:我比较喜欢这个版本的cheetah cherrypy:一个WEB framework c ...

  7. python发明小故事_一个与python有关的故事

    背景 近期系统需求上来迟缓,也腾出了一些时间来梳理沉淀.对系统的代码进行审视,sonar静态检测,消除检测问题.也是还债的过程.回顾过往的坑,有些东西还是要沉淀下来.接下来节听听故事的来龙去脉. 一个 ...

  8. 自学python的经典书籍_有哪些 Python 经典书籍?

    内容太长,完整内容请访问原文: python 3.7极速入门教程9最佳python中文工具书籍下载 筛选了2年内优秀的python书籍,个别经典的书籍扩展到5年内. python现在的主流版本是3.7 ...

  9. python数据科学手册_小白入门Python数据科学

    前言 本文讲解了从零开始学习Python数据科学的全过程,涵盖各种工具和方法 你将会学习到如何使用python做基本的数据分析 你还可以了解机器学习算法的原理和使用 说明 先说一段题外话.我是一名数据 ...

最新文章

  1. 又一个巨头决定彻底放弃微服务,全面拥抱K8S!
  2. debug工具_Jupyter官方神器:可视化 Debug 工具!
  3. 基于计算机的控制系统,基于计算机的机械控制系统实现方式研究.pdf
  4. 关于工程技术中PE、ME、TE、IE、EE的解说
  5. 前端学习(2765):如何传递事件和参数
  6. 12月29日二周五次【Python基础语法】
  7. 安卓手机备份_备份安卓手机中的APK安装文件?小编这儿有4种方法
  8. docker运行jar包_Jenkins+Docker+Springboot单机版持续集成部署
  9. VS Code 必知必会的 20 个快捷键!
  10. php查看mysql连接数_查看mysql当前连接数
  11. Java开发笔记(一百四十二)JavaFX的对话框
  12. C# 提示框 鼠标移动到控件提示 toolTip气泡提示框
  13. Caffe(12)--实现YOLOv2目标检测
  14. vue 动态背景图轮播
  15. uni-app 安卓实现监听 PDA 扫码枪等设备按钮
  16. PS 批处理切图去空白
  17. Boost电路的参数设计
  18. iOS苹果开发者账号(公司账号)申请流程详解
  19. python的PIL库
  20. 1 c语言程序设计学生选修课管理,c语言课程设计报告-学生选修课信息管理程序.doc...

热门文章

  1. 安裝jpeg-6b png error错误解决方法
  2. SQLPLUS 使用的一些技巧
  3. 创建oracle 数据库表空间,角色,用户的sql语句
  4. 领域驱动设计的简略设计步骤
  5. 解耦与人类行为 (完整)
  6. java中匿名数组_Swagger UI:数组中的多个匿名对象
  7. python中的装饰器怎么运行_Python 装饰器入门(上)
  8. Spark 常见问题小结
  9. vqa mcb_MCB的完整形式是什么?
  10. c 语言bool 类型数据_C ++中的bool数据类型