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/