ctypes

ctypes类型 C型 Python类型
c_bool _Bool bool
c_char char 1个字符的字节对象
c_wchar wchar_t 1个字符的字符串
c_byte char int
c_ubyte 无符号 char int
c_short short int
c_ushort 无符号 短 int
c_int int int
c_uint 无符号 int int
c_long long int
c_ulong 无符号 长 int
c_longlong __int64或长 长 int
c_ulonglong 无符号 __ int64或无符号 长 长 t6 > int
c_size_t size_t int
c_ssize_t ssize_t or Py_ssize_t int
c_float float float
c_double double float
c_longdouble long double float
c_char_p char *(NUL terminated) 字节对象或None
c_wchar_p wchar_t *(NUL terminated) 字符串或None
c_void_p void * int或None
In[2]: from ctypes import *
In[3]: i = c_int32(1)  # c语言数字类型
In[4]: i
Out[4]: c_long(1)  # 
In[5]: i.value = 2  # 通过.value来赋值
In[6]: i
Out[6]: c_long(2)
In[7]: p = pointer(i)  # 创建指针指向i
In[8]: p
Out[8]: <ctypes.wintypes.LP_c_long at 0x5628f48>
In[9]: p.contents  # 访问指针内容
Out[9]: c_long(2)
In[10]: p.contents = c_int(1)  # 改变指针指向的内容
In[11]: p
Out[11]: <ctypes.wintypes.LP_c_long at 0x5628f48>  # 指针没有发生变化
In[12]: p.contents
Out[12]: c_long(1)  # 指针指向的内容发生了变化

测试单个c函数方法接口

windows的dll,linux下的so
1.编写single.c

#include <stdio.h>                                                                 
int add(int a){a = a +1;return a;
}

2.编译single.c

gcc single.c -shared -o single.so //shared选项是让c的方法可以被外部调用

3.测试
3.1.测试调用c函数的时间
编写single_c.py

from ctypes import cdll
c_lib=cdll.LoadLibrary('./single.so')
a=1
for i in range(1000000):a=c_lib.add(a)
print(a)

编写single_py.py

def add(a):a = a + 1return aa=1
for i in range(1000000):a=add(a)
print(a)

使用cProfile对二者进行测试

python -m cProfile single_py.py # 测试纯python脚本的计算结果
1000003 function calls in 0.314 secondspython -m cProfile single_c.py # 测试有c接口的python脚本计算结果
136 function calls in 0.339 seconds

结果是纯python脚本的速度要高于有c接口的

测试带有循环的c函数接口

1.编写loop.c

#include <stdio.h>
int add(int a){int i;for(i =1;i <=1000000;i++){a = a +1;}return a;
}

2.编译loop.c

gcc single.c -shared -o single.so //shared选项是让c的方法可以被外部调用

3.测试
3.1.测试调用c函数的时间
编写single_c.py

from ctypes import cdll                                                                                                         
c_lib=cdll.LoadLibrary('./hello_world.so')                                         
a=1                                                                                
a=c_lib.add(a)                                                                     
print(a)

使用cProfile对二者进行测试

python -m cProfile single_py.py # 测试纯python脚本的计算结果
1000003 function calls in 0.314 secondspython -m cProfile loop_c.py # 测试有c接口的python脚本计算结果
135 function calls in 0.008 seconds

参考文献:
https://docs.python.org/2/library/ctypes.html
https://www.cnblogs.com/gaowengang/p/7919219.html
http://www.jb51.net/article/71216.htm
http://python.jobbole.com/87044/

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注