cython(一)

最近在看retinanet的代码,发现里面的compute_overlap(),也就是iou的计算,都是cython写的

再看到retina-face,里面的nms也是用cython写的,而且觉得这个nms的效果比tensor的好,想看看到底为什么好,就把cython先搞懂一下.

环境构建

1. 安装Cython库

   pip install Cython

step1: 新建一个hello.pyx文件, 内容为

a=1
print(a)

step 2: 新建一个setup.py文件,目的是使用cython编译器,里面代码为

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize("hello.pyx", annotate=True)#这是让cython在编译的时候把一些信息输入出来,编译完成后,我们发现除了.c文件和.so文件之外,还有一个html文件
)

cythonize()是Cython提供将python代码转换成C代码的API,setup是python提供的一种发布python模块的方法

step3: 当前目录打开一个终端,进行编译,输入脚本

python setup.py build_ext --inplace build_est

其中,build_ext是指明python 生成c/c++的扩展模块, --inplace 指示,将编译后的扩展模块直接放在与test.py同级的目录里,网络流程为

然后,我们就可以看到当前文件夹下多了3个文件和一个build文件夹,一个是hello.c,hello.html,一个是hello.cpython-36m-x86_64-linux-gnu.so

这里,hello.c文件就是cython将我们的hello.pyx文件转换成了一个c文件,不依赖平台,而后面的so或者pyd文件,则是将c文件进行编译后的一个文件,依赖于平台.这个时候,so文件就可以像普通的python文件一样,被import.

当然,每次如果都要这样写个setup文件编译一下,还是挺烦的,还好cython给我们提供了一个很方便的解决方案,写完hello.pyx的cython代码之后,不需要编译,当我们需要使用的时候,在文件前面加上

# cython: language_level=3 #加这一句是为了防止警告出现
import pyximport
pyximport.install() #这样的引用方式就不需要编译了
import hello

然后就可以了,其实,不是不用编译了,而是cython默默帮我们编译好了,放在其他地方罢了,对于我们使用者而言,整体就简洁了.

备注:个人感觉,我直接把py文件重命名为pyx,然后按照上面的引用就可以了,但没有去测试是否快一些

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值