Cython 的简要入门、编译及使用
Cython是一种通过python语法编写C扩展的编程语言,特点是支持可选的静态类型声明语言的一部分,源代码可被翻译成优化的C/C++代码并编译成python扩展模块。Cython既具备python快速开发的特点,又可以让代码运行速度像C/C++一样快,甚至可以调用C library。
简介
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混编的方法有三种:
- Python/C API,不但代码繁琐1,编译构建也复杂,所以才用Cython取代Python/C API
- gcc手工编译生成.so文件
- 使用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
后续
喜欢的话可以关注一下我的公众号技术开发小圈,尤其是对深度学习以及计算机视觉有兴趣的朋友,我会把相关的源码以及更多资料发在上面,希望可以帮助到新入门的大家!
更多推荐
所有评论(0)