使用Cython为python代码加速

1.变量声明语法比较
python为x = 0.5  Cython为cdef float x = 0.5

这告诉Cython我们的变量是浮点数,和C一样。使用纯Python,变量的类型是动态确定的。Cython中类型的显式声明是可以转换为C的原因,因为需要显式类型声明+

安装cython就可以使用pip install cython


使用Cython时,有两种不同的类型,用于变量和函数。
对于变量,我们有:
cdef int a, b, c
cdef char *s
cdef float x = 0.5 (single precision)
cdef double x = 63.4 (double precision)
cdef list names
cdef dict goals_for_each_play
cdef object card_deck




编写两份文件分别为run_python.py和run_cython.pyx文件
run_python.py 文件内容如下
def test(x):

  y = 1

  for i in range(x+1):

    y *= i

  return y


run_cython.pyx文件如下
cpdef int test(int x):

    cdef int y = 1

    cdef int i

    for i in range(x+1):

        y *= i

    return y


注意:这个是需要编译的,新建一个setup.py文件,内容如下
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize('run_cython.pyx'))
编译命令:python setup.py build_ext --inplace

编译完成之后会生成两份文件,可以进行相关源码查看
/home/python/Desktop/code/run_cython.c
/home/python/Desktop/code/run_cython.cpython-35m-x86_64-linux-gnu.so



下面进行python与cython效率比较
新建test.py文件,内容如下
import run_python
import run_cython
import time

number = 50
start = time.time()
run_python.test(number)
end =  time.time()
py_time = end - start
print("Python time = {}".format(py_time))
start = time.time()
run_cython.test(number)
end =  time.time()
cy_time = end - start
print("Cython time = {}".format(cy_time))
print("Speedup = {}".format(py_time / cy_time))


运行效率输出对比:python test.py
# 效率明显高于python代码
# Python time = 4.291534423828125e-06
# Cython time = 1.1920928955078125e-06
# Speedup = 3.6
# Cython几乎可以为任何原始Python代码提供良好的加速,不需要做太多额外的工作。记住,你用的循环越多、处理的数据越多,Cython就越有帮助

 

你可能感兴趣的:(使用Cython为python代码加速)