简介

​ Cython是一种通过python语法编写C扩展的编程语言,特点是支持可选的静态类型声明语言的一部分,源代码可被翻译成优化的C/C++代码并编译成python扩展模块。Cython既具备python快速开发的特点,又可以让代码运行速度像C/C++一样快,甚至可以调用C library。

​ Python官方就提供了Python/C API可以实现python和C语言的混编,但是其编写复杂,入门门槛高,于是Cython横空出世。Cython的编译环境需要有C编译器,可以直接通过pip安装。

pip install cython

编译方法

​ 通常情况下python和C混编的方法有三种:

  1. Python/C API,不但代码繁琐1,编译构建也复杂,所以才用Cython取代Python/C API
  2. gcc手工编译生成.so文件
  3. 使用setup.py直接生成.so文件(推荐)

setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

extensions = [
    Extension("拓展名", [".pyx文件名"],
        include_dirs=[...],
        libraries=[...],
        library_dirs=[...]),
    Extension("拓展名", [".pyx文件名"],
        include_dirs=[...],
        libraries=[...],
        library_dirs=[...]),
]

"""
name             包的名字
ext_modules      要构建的 Python 扩展的列表
"""
setup(
    name="包的名称",
    ext_modules=cythonize(extensions))

编译生成.so文件

python3 setup.py install

​ setuptools会自动帮我们编译出.c文件以及build文件夹,其中含有.so和.o文件。

Cython类型

​ 作为一门典型的解释型语言,python在运行的时候需要不停的解释、执行、解释、执行,即使是同一条命令也是一样,每次都要重新的进行解释和执行,这是python速度慢的重要原因。cython将python语言转化为编译型代码,不再像解释型代码那样

类型定义

​ 在Cython里定义一个C变量和C语言类似,不同的地方就是在声明的最前面要加上cdef,另外,末尾不用加分号:

cdef int an[10]

cdef int n = 123

cdef int *pn = &n

printf("%d \n",pn[0])

​ Tips:Cython里不能用类似*ptr这样代码来对指针变量进行取值,而必须用ptr[0]这样的形式。

类型转换

在Cython里用<>替代了()来进行类型转换,如:

cdef float a= 123.456

cdef int b

b = <int>a

Cython & C++

​ Cython不仅能够与C实现混编,如今,它也已经能够实现与C++的混编,要生成相应的CPP文件,只需要在.pyx文件开头注明:

# distutils: language = c++

​ 这里要注意的是这两个函数:__cinit__和__dealloc__作用很简单,在__cinit__里进行C++相关变量的初始化,如C++对象的初始化。在__dealloc__可以释放C++对象,要注意的是,__cinit__不要调用Cython类的成员变量,因为这个时候Cython的类变量可能还没有初始化,会引发异常。

参考

Cython: C-Extensions for python

Cython教程与代码之——Cython_tutorial

后续

 喜欢的话可以关注一下我的公众号技术开发小圈,尤其是对深度学习以及计算机视觉有兴趣的朋友,我会把相关的源码以及更多资料发在上面,希望可以帮助到新入门的大家!
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐