关于python调用c/c++代码编译的动态库

现在深度学习在CV领域非常流行,多如牛毛的学习框架也使深度学习变得简单,但是目前大多数学习框架都是基于python开发也提供友好方便的python调用接口,因此我们搭建模型与训练网络的时候用一些python监本的形式是方便的,python这个所谓的胶水语言典型的缺点就是运算速度太慢,与c/c++相比简直不忍直视,大多数的学习框架都使用了gpu进行加速,但gpu加速的编程对于我这样的小白来说难度太大,因此探究了如何用python与c/c++混合编程的形式实现一些深度学习框架以外的函数。博主亲测了使用python调用c代码编译的动态库的形式比纯python的实现要快上几百倍,这个还是没使用多线程,gpu等一些加速策略的前提下,当然封装库的时候也可以用上多线程等加速策略,效果会更显著。

1.python脚本中使用ctypes导入c/c++动态库

(1)win下python调用:

  import ctypes
  lib=ctypes.cdll.LoadLibrary('xxx/xxx.dll')或lib=ctypes.CDLL('xxx/xxx.dll')

(2)linux下python调用:

  import ctypes
  lib=ctypes.cdll.LoadLibrary('xxx/xxx.so')或lib=ctypes.CDLL('xxx/xxx.so')

2.如何将c/c++代码编译成.dll/.so

(1)win下编译:

这个不用多说了,可以借助VS编译,也可以借助GCC编译,但值得一提的是,如果python是32位的,则必须编译32位的库,64位的python必须编译64位的库,否则调用时会报错。
具体VS平台如何编译可参考:https://www.cnblogs.com/xiacaojun/p/9968284.html或https://www.jianshu.com/p/2c086c2f351d
具体编译的32或64位库如何切换可以参考:https://blog.csdn.net/www89574622/article/details/77160014
(2)linux下编译:

linux下编译更简单了,一句话搞定:gcc -o xxx.so -shared -fPIC xxx.c,但也要注意32和64位库的对应。

3.将python中的数据传到c/c++库的接口

深度学习中最最常用的数据类型当然是张量,python脚本一般用numpy的数据类型存储tensor,因此如何将numpy的数据类型传入接口是需要的,我们可以使用numpy的npct,举例如下:
假设接口:void fun(unsigned char *in, unsigned char *out, int a, float b)
调用形式如下:lib.fun.argtypes = [
npct.ndpointer(dtype=np.uint8,ndim=3),
npct.ndpointer(dtype=np.uint8,ndim=2),
c_int,
c_float
]
这个是指定接口的数据类型,然后后面可以正常调用了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值