文章目录
介绍
Cython
和Python
、C
一样,都是一种编程语言,不过Cython
是把Cython
代码转化为C
语言代码,然后再编译成链接库供Python
导入使用的。对于Cython
写成的类Python
代码,不论是否进行C
类型的变量声明,都会有一定的速度提升。
一、编写包文件
1、纯Python包
python_calc.py
def Func(n):
t = 0
for i in range(n):
j = i * 2
for k in range(j):
t += k*0.1
return t
2、利用上面的代码写Cython文件
cython_calc.pyx
.pyx文件指代的就是Cython文件(和 .cpp .py .c 类似)
def Func(n):
t = 0
for i in range(n):
j = i * 2
for k in range(j):
t += k*0.1
return t
3、添加C类型声明的Cython文件
cython_calc_ctype,pyx
对上面的代码进行优化,添加类型修饰
def Func(int n):
cdef double t = 0 # cdef 就是声明 C 类型变量
cdef int i, j, k
for i in range(n):
j = i * 2
for k in range(j):
t += k*0.1
return t
二、包的调用对比
1、编写setup.py文件
setup.py
文件相当于C
中的makefile
,是用来管理代码文件的编译生成的。简单示例如下:
from setuptools import setup
from Cython.Build import cythonize
setup(
name='Calc app',
ext_modules=cythonize("cython_calc.pyx", annotate=True), # annotate=True 会生成Html文件,可用来对照 Python 程序和 C 程序的重合情况
zip_safe=False,
)
setup(
name='Calc ctype app',
ext_modules=cythonize("cython_calc_ctype.pyx", annotate=True),
zip_safe=False,
)
因为上面编写了两个.pyx
文件,所有这里要生成两份库。
2、生成C代码和.pyd文件
在命令行中输入
python setup.py build_ext --inplace
会生成以下的文件:
其中.c
是C语言文件,不过应该不是给人看的,因为就上面的几行代码,生成的C语言有2千多行。
.pyd
文件是供Python调用的,在编写Python代码时,可以直接使用import
导入。
.html
打开后如下:
其中黄色的部分代表的是与Python交互的部分,颜色越深交互越多。
三、调用速度对比
import time
import python_calc
import cython_calc
import cython_calc_ctype
calc_value = 10000
start = time.time()
print("python ", python_calc.Func(calc_value)) # 调用纯Python
print("time consume: {}".format(time.time()-start))
start = time.time()
print("cython ", cython_calc.Func(calc_value)) # 调用Cython
print("time consume: {}".format(time.time()-start))
start = time.time()
print("cython-ctype ", cython_calc_ctype.Func(calc_value)) # 调用改写类型后的Cython
print("time consume: {}".format(time.time()-start))
运行结果:
python 66651667499.996315
time consume: 4.276027202606201
cython 66651667499.996315
time consume: 2.4274239540100098
cython-ctype 66651667499.996315
time consume: 0.09039545059204102
总结
Cython对于Python代码的提速有一定帮助,尤其是对关键代码进行C类型优化后,速度会提升很多。