cython(一)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_38145317/article/details/100560332

最近在看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个文件和一个builde文件夹,一个是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文件编译一下,还是挺烦的,还好cuthon给我们提供了一个很方便的解决方案,写完hello.pyx的cython代码之后,不需要编译,当我们需要使用的时候,在文件前面加上

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

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

猜你喜欢

转载自blog.csdn.net/weixin_38145317/article/details/100560332
今日推荐