在学习和训练mask rcnn中发现用了cython编程,特此整理。
Cython是一个快速生成Python扩展模块的工具,从语法层面上来讲是Python语法和C语言语法的混血,当Python性能遇到瓶颈时,Cython直接将C的原生速度植入Python程序,这样使Python程序无需使用C重写,能快速整合原有的Python程序,这样使得开发效率和执行效率都有很大的提高,还能加速程序的速度。
方法1 官网下载安装,Cython官网地址是:http://cython.org/
方法2 直接用在现有环境下直接用anaconda安装cython
使用命令 conda install cython
1…pyx中用cdef定义的东西,除类以外对.py都是不可见的;
2.py中是不能操作C类型的,如果想在.py中操作C类型就要在.pyx中从python object转成C类型或者用含有set/get方法的C类型包裹类;
3.虽然Cython能对Python的str和C的“char *”之间进行自动类型转换,但是对于“char a[n]”这种固定长度的字符串是无法自动转换的。需要使用Cython的libc.string.strcpy进行显式拷贝;
4.回调函数需要用函数包裹,再通过C的“void *”强制转换后才能传入C函数。
1 首先编写一个hello.pyx的脚本
print('hello world')
2 然后我们新建一个setup.py脚本,这个python文件的目的就是使用cython编译器去编译pyx成一个cython文件,代码很简单
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("hello_world.pyx")
)
3 执行setup.py脚本
python setup.py build_ext --inplace
这时候cython将我们的pyx文件解析成一个c文件和一个so文件(linux)或者pyd文件(windows)。这个so文件或者pyd文件就可以像普通的python文件一样,被import。
import hello_world
但是每次都需要写一个setup文件十分不方便,所以cpython提供了另一种解决方法
import pyximport
pyximport.install()
import hello_world
这样cython会默默帮我们编译好了,放在其他地方,灰常方便我们的使用。
1 首先编写一个hello.pyx的脚本
print('hello world')
2 然后我们新建一个setup.py脚本,这个python文件的目的就是使用cython编译器去编译pyx成一个cython文件,代码很简单
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("hello_world.pyx")
)
3 执行setup.py脚本
python setup.py build_ext --inplace
这时候cython将我们的pyx文件解析成一个c文件和一个so文件(linux)或者pyd文件(windows)。
4 编写一个同名的py文件
import sys, pkg_resources, imp
def __bootstrap__():
global __bootstrap__, __loader__, __file__
__file__ = pkg_resources.resource_filename(__name__, 'hello world.so')
__loader__ = None
del __bootstrap__, __loader__
imp.load_dynamic(__name__, __file__)
__bootstrap__()
这时候我们直接impor这个py文件就可以了。