利用ctypes给python加速
来源:互联网 发布:注册淘宝账号 编辑:程序博客网 时间:2024/06/07 06:45
好久没写博客了,来水一篇,今天写写怎么用ctypes给Python加速。
最近在用pyspark,然而Python效率实在太低,只能用C加速了。先说说结果,加速后C运行速度比Python快1000倍,因为我们的程序有特别大的双层循环,还有位操作。用C的时候,我还用了一些memcpy, memset, memcmp等操作,所以加速非常明显。
利用C语言给Python加速的方法特别多,可以用ctypes, cython, numpy, boost 等等。cython是最简易的,但是前提是必须安装cython,然而我们的spark并没有,我不可能给50多个机器安装cython;numpy有些麻烦,对象管理起来复杂,经常出现seg fault,可以看看github上numpy源码怎么写的;boost也一样,机器上没有。于是,只能用ctypes了。
好在ctypes非常简单好用,只是功能很少,但是对于一个纯C的程序来说,足够了。
ctypes可以直接加载动态库(Linux)
import ctypesfrom ctypes import *libc = CDLL('libc.so.6')libc.printf('Hello world %d \n.', c_int(2017))
所以你可以直接很方便地调用windows的dll文件或者linux的.so。
可以查看一下ctypes下面有哪些东西:
print dir(ctypes)
ctypes的类型与python、c对应关系:
如果你只是简单地从Python传递一个ctypes基本类型给c程序,是非常容易的。
例如,定义一个c函数:
//test1.cint func(int x){ return x * 2;}
#用gcc编译gcc -shared -fPIC -O3 -o test1.so test1.c
from ctypes import *x = c_int(10)test1 = CDLL('./test1.so')func = test1.funcfunc.argtypes = [c_int,] #定义输入类型func.restype = c_int #定义输出类型print(func(x))
如果你想使用数组,那也很简单:
假设你定义了一个c函数:
void func2(int *x){ }
编译后成为 test2.so
,现在:
from ctypes import *test2 = CDLL('./test2.so')func2 = test2.func2func2.argtypes = [POINTER(c_int),]x = (c_int * 100)()cast(x, POINTER(c_int)) #把x的类型强制转换为需要的整数指针func2(x)
ctypes用起来还是非常简单的。
其实ctypes还可以用来操作自定义的struct,可以看看官方文档。
相关资料:
http://starship.python.net/crew/theller/ctypes/tutorial.html
https://docs.python.org/3/library/ctypes.html
- 利用ctypes给python加速
- Python编程.利用ctypes调用Windows API
- Python--ctypes
- Python Ctypes
- python ctypes
- python脚本利用ctypes调用c模块返回字符串
- 利用squid给公司内网加速..
- ctypes-Python外部函数库
- python 实践之 ctypes
- [python相关]ctypes模块
- ctypes模块扩展python
- Python ctypes 模块
- python ctypes常用方法
- 给Python加速(性能加速的方法)
- 【Python】聊聊Python ctypes 模块
- 【2013】实习收获4:关于python中利用ctypes调用c++代码的学习总结
- 利用七牛云存储CDN服务 | 给WordPress静态文件加速
- python 线程,GIL 和 ctypes
- Android简单计算器实现
- iOS对sqlite3进行封装
- 【算法】象山十三张手牌分析代码
- 电话拨号器 点击事件(让Activity实现点击事件的接口)
- cartographer源码分析(35)-io-fixed_ratio_sampling_points_processor.h
- 利用ctypes给python加速
- Idea配置远程和启动远程服务器debug
- pyhon-在原文本文件中替换某些特定的字符
- js逻辑与或非
- BZOJ 1124: [POI2008]枪战Maf 贪心 乱搞
- B
- 关于 findViewById()方法和资源 ID 的重复问题
- https://ecs-buy.aliyun.com
- NOTES of NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE