位置: 编程技术 - 正文
推荐整理分享Python优化技巧之利用ctypes提高执行速度(python最优化),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:python性能优化方法,python 优化,python 优化,python 优化,python性能优化方法,python最优化,python优化问题求解,python优化问题求解,内容如对您有帮助,希望把文章链接给更多的朋友!
首先给大家分享一个个人在使用python的ctypes调用c库的时候遇到的一个小坑
这次出问题的地方是一个C函数,返回值是malloc生成的字符串地址。平常使用也没问题,也用了有段时间, 没发现什么异常。
这次在测试中,发现使用这个过程会出现“段错误”,造成程序退出了。
经过排查, 确定问题原因是C函数的返回值问题,ctypes默认的函数返回类型是int类型。
需要在使用中设置返回类型,例如:
func.restype = c_char_p
下面我们就来详细探讨下ctypes的使用小技巧
ctypes 库可以让开发者借助C语言进行开发。这个引入C语言的接口可以帮助我们做很多事情,比如需要调用C代码的来提高性能的一些小型问题。通过它你可以接入Windows系统上的 kernel.dll 和 msvcrt.dll 动态链接库,以及Linux系统上的 libc.so.6 库。当然你也可以使用自己的编译好的共享库
我们先来看一个简单的例子 我们使用 Python 求 以内素数,重复这个过程次,并计算运行时间。
Output
.
下面用C语言写一个的 check_prime 函数,然后把它当作共享库(动态链接库)导入
使用以下命令生成 .so (shared object)文件
gcc -shared -o prime.so -fPIC prime.c
Output
我们可以看到很明显的性能差距 这里 有更多的方法去判断一个数是否是素数
再来看一个复杂点的例子 快速排序
mylib.c
gcc -shared -o mylib.so -fPIC mylib.c
使用ctypes有一个麻烦点的地方是原生的C代码使用的类型可能跟Python不能明确的对应上来。比如这里什么是Python中的数组?列表?还是 array 模块中的一个数组。所以我们需要进行转换
test.py
Output
1.
与Python list 的 sort 方法进行对比
Output
2.
至于结构体,需要定义一个类,包含相应的字段和类型
除了导入我们自己写的C语言扩展文件,我们还可以直接导入系统提供的库文件,比如linux下c标准库的实现 glibc
Output
以上都是ctypes的基本技巧,对普通的开发人员来说,基本够用了
更详细的说明请参考:
Python 如何访问外围作用域中的变量 在表达式中引用变量时,Python会按照如下的顺序遍历各个作用域,寻找该变量:当前函数作用域任何外围作用域(比如包含当前函数的其他函数)global
Python中使用asyncio 封装文件读写 前言和网络IO一样,文件读写同样是一个费事的操作。默认情况下,Python使用的是系统的阻塞读写。这意味着在asyncio中如果调用了f=file('xx')f.read()会阻塞
asyncio 的 coroutine对象 与 Future对象使用指南 coroutine与Future的关系看起来两者是一样的,因为都可以用以下的语法来异步获取结果,result=awaitfutureresult=awaitcoroutine实际上,coroutine是生成器函数,它
标签: python最优化
本文链接地址:https://www.jiuchutong.com/biancheng/385411.html 转载请保留说明!友情链接: 武汉网站建设