解析Python扩展模块的加速方案

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中来,因此要使用控制台来输出

是不是已经成功输出了?

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

以上就是解析Python扩展模块的加速方案的详细内容,更多关于Python扩展模块加速方案的资料请关注我们其它相关文章!

(0)

相关推荐

  • 使用Pyrex来扩展和加速Python程序的教程

    Pyrex 是一种专门设计用来编写 Python 扩展模块的语言.根据 Pyrex Web 站点的介绍,"它被设计用来在友好易用的高级 Python 世界和凌乱的低级 C 世界之间搭建一个桥梁."虽然几乎所有的 Python 代码都可以作为有效的 Pyrex 代码使用,但是您可以在 Pyrex 代码中添加可选的静态类型声明,从而使得这些声明过的对象以 C 语言的速度运行. 加速 Python 从某种意义上来说,Pyrex 只是不断发展的 Python 类语言系列的一个部分:Jython

  • Python加速程序运行的方法

    问题 你的程序运行太慢,你想在不使用复杂技术比如C扩展或JIT编译器的情况下加快程序运行速度. 解决方案 关于程序优化的第一个准则是"不要优化",第二个准则是"不要优化那些无关紧要的部分". 如果你的程序运行缓慢,首先你得使用14.13小节的技术先对它进行性能测试找到问题所在. 通常来讲你会发现你得程序在少数几个热点位置花费了大量时间, 比如内存的数据处理循环.一旦你定位到这些点,你就可以使用下面这些实用技术来加速程序运行. 使用函数 很多程序员刚开始会使用Pyth

  • 用Cython加速Python到“起飞”(推荐)

    事先声明,标题没有把"Python"错打成"Cython",因为要讲的就是名为"Cython"的东西. Cython是让Python脚本支持C语言扩展的编译器,Cython能够将Python+C混合编码的.pyx脚本转换为C代码,主要用于优化Python脚本性能或Python调用C函数库.由于Python固有的性能差的问题,用C扩展Python成为提高Python性能常用方法,Cython算是较为常见的一种扩展方式. 我们可以对比一下业界主流的几

  • python运行加速的几种方式

    目录 一.总结 二.全面加速(pypy) 二.减少文件的打开即with的调用 三.if判断靠前 一.总结 1.使用pypy 2.减少函数化调用 3.减少文件的打开即with的调用,将这一调用放在for循环前面,然后传递至后面需要用到的地方 4.if函数判断条件多的尽量在前面 全面加速(pypy) 二.全面加速(pypy) 将python换为pypy,在纯python代码下,pypy的兼容性就不影响使用了,因为一些纯python的代码常常会用pypy进行一下加速 测试代码,for循环1000000

  • 解析Python扩展模块的加速方案

    ctypes(一) - 初识 很多初学Python的新手,总是嘴边挂着一句话:"Python是一门胶水语言". 可是究竟什么是胶水语言呢?相信很多人都不知道,或者误以为胶水就是可以直接和其他所有语言配合的语言. 虽然如今Python已经发展得很强大了,"胶水语言"这个特性已经很少被提及了.但是胶水仍然是它现在应用得最广泛的特性之一.只不过从曾经Python为辅变成了如今的Python为主而已. 那么到底什么是"胶水特性"呢? 其实Python自打

  • 通过实例解析Python调用json模块

    这篇文章主要介绍了通过实例解析Python调用json模块,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 介绍 今天介绍一种数据格式,json.Json是JavaScript Object Notation的缩写,区别于txt.csv,json编码格式更加灵活,在工作也会经常遇到.在Python中要读写json是十分方便的,只需要调用json模块. 使用 直接导入模块 import json 两个读写数据的函数: json.dumps() 和

  • 通过实例解析python描述符原理作用

    这篇文章主要介绍了通过实例解析python描述符原理作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本质上看,描述符是一个类,只不过它定义了另一个类中属性的访问方式.换句话说,一个类可以将属性管理全权委托给描述符类. 描述符类基于以下三种特殊方法,换句话说,这三种方法组成了描述符协议: __set__(self, obj, type = None): 在设置属性时,将调用这一方法. __get__(self, obj, value): 在读

  • 解析python 中/ 和 % 和 //(地板除)

    python / 和 % 和 //(地板除)用于对数据进行除法运算. python中 // 和 / 和 % 简介 python中与除法相关的三个运算符是// 和 / 和 %,下面逐一介绍. "/",这是传统的除法,3/2=1.5 "//",在python中,这个叫"地板除",3//2=1 "%",这个是取模操作,也就是区余数,4%2=0,5%2=1 Python中分为3种除法:1./,2.%,3.//. 1./ 基于 pyth

  • 解析python 类方法、对象方法、静态方法

    python中实现静态方法和类方法都是依赖于python的修饰器来实现的. 对象方法有self参数,类方法有cls参数,静态方法是不需要这些附加参数的. 1.我们已经讨论了类/对象可以拥有像函数一样的方法,这些对象方法与函数的区别只是一个额外的self变量 # -*- coding:utf-8 -*- #!/usr/bin/python # Filename: method.py class Person: grade=1 def __init__(self,name): self.name =

  • Requests什么的通通爬不了的Python超强反爬虫方案!

    一.前言 一个非常强的反爬虫方案 -- 禁用所有 HTTP 1.x 的请求! 现在很多爬虫库其实对 HTTP/2.0 支持得不好,比如大名鼎鼎的 Python 库 -- requests,到现在为止还只支持 HTTP/1.1,啥时候支持 HTTP/2.0 还不知道. Scrapy 框架最新版本 2.5.0(2021.04.06 发布)加入了对 HTTP/2.0 的支持,但是官网明确提示,现在是实验性的功能,不推荐用到生产环境,原文如下: " HTTP/2 support in Scrapy is

  • Python实现GPU加速的基本操作

    目录 CUDA的线程与块 用GPU打印线程编号 用GPU打印块编号 用GPU打印块的维度 用GPU打印线程的维度 总结 GPU所支持的最大并行度 GPU的加速效果 总结概要 CUDA的线程与块 GPU从计算逻辑来讲,可以认为是一个高并行度的计算阵列,我们可以想象成一个二维的像围棋棋盘一样的网格,每一个格子都可以执行一个单独的任务,并且所有的格子可以同时执行计算任务,这就是GPU加速的来源.那么刚才所提到的棋盘,每一列都认为是一个线程,并有自己的线程编号:每一行都是一个块,有自己的块编号.我们可以

  • 表格梳理解析python内置时间模块看完就懂

    目录 无参数函数 时区概念 struct_time time.strftime(format[, t]) 无参数函数 先解释一下时间戳,所谓时间戳,即自1970年1月1日00:00:00所经历的秒数,然后就可以理解下面的函数了.下面代码默认 from time import * implementation monotonic adjustable resolution 'time' GetSystemTimeAsFileTime() False True 0.015625 'thread_ti

  • 解析python高级异常和运算符重载

    目录 一.高级异常 二.环境管理器 2.1.对象的属性管理函数 三.运算符重载 3.1.算术运算符的重载 四.反向算术运算符的重载 五.复合赋值算术运算符的重载 六.比较运算符的重载 七.位运算符重载 八.反向位运算符重载 九.复合赋值位运算符重载 十.一元运算符的重载 十一.in / not in 运算符的重载 十二.索引和切片运算符的重载 十三.slice 构造函数 一.高级异常 回顾异常相关的语句: try-except:用来捕获异常的通知 try-finally:用来做一定要做的事 re

  • 30 个 Python 函数,加速数据分析处理速度

    目录 1.删除列 2.选择特定列 3.nrows 4.样品 5.检查缺失值 6.使用 loc 和 iloc 添加缺失值 7.填充缺失值 8.删除缺失值 9.根据条件选择行 10.用查询描述条件 11.用 isin 描述条件 12.Groupby 函数 13.Groupby与聚合函数结合 14.对不同的群体应用不同的聚合函数 15.重置索引 16.重置并删除原索引 17.将特定列设置为索引 18.插入新列 19.where 函数 20.等级函数 21.列中的唯一值数 22.内存使用情况 23.数据

随机推荐