ctypes

ctypes类型C型Python类型
c_bool_Boolbool
c_charchar1个字符的字节对象
c_wcharwchar_t1个字符的字符串
c_bytecharint
c_ubyte无符号 charint
c_shortshortint
c_ushort无符号 短int
c_intintint
c_uint无符号 intint
c_longlongint
c_ulong无符号 长int
c_longlong__int64或长 长int
c_ulonglong无符号 __ int64或无符号 长 长 t6 >int
c_size_tsize_tint
c_ssize_tssize_t or Py_ssize_tint
c_floatfloatfloat
c_doubledoublefloat
c_longdoublelong doublefloat
c_char_pchar *(NUL terminated)字节对象或None
c_wchar_pwchar_t *(NUL terminated)字符串或None
c_void_pvoid *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 + 1
    return a

a=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 seconds

python -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 seconds

python -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/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值