Python是许多程序员喜欢的语言。 这种语言非常易于使用。 事实是,用Python编写的代码直观且可读性强。 但是,在有关Python的对话中,人们经常会听到关于这种语言的同样抱怨。 尤其是当C专家在谈论Python时,它的发音是:“ Python很慢。” 那些这样说的人不要违背真理。
与许多其他编程语言相比,Python确实很慢。
这是测试结果,用于比较不同编程语言在解决各种问题上的性能。

有几种方法可以加快Python程序的速度。 例如,您可以使用旨在使用多个处理器内核的
库 。 建议使用Numpy,Pandas或Scikit-Learn的人员查看
Rapids软件包,该软件包可让您在科学计算中使用GPU。
在可以并行使用Python解决的任务的情况下,所有这些加速技术都是很好的。 例如,这些是用于初步数据处理或使用矩阵进行操作的任务。
但是,如果您的代码是纯Python怎么办? 如果您有一个绝对必须使用的大的
for
循环,又由于必须顺序处理该数据而无法并行执行该怎么办? 有什么方法可以加快Python本身的速度吗?
Cython提供了此问题的答案-Cython是一个项目,您可以使用该项目显着加快用Python编写的代码的速度。
什么是赛顿?
Cython的核心是介于Python和C / C ++之间的中间层。 Cython允许您编写经过一些小的修改的常规Python代码,然后将其直接转换为C代码。
Python代码的唯一变化是将有关其类型的信息添加到每个变量。 在编写常规的Python代码时,您可以这样声明一个变量:
x = 0.5
在声明变量时使用Cython时,需要指定其类型:
cdef float x = 0.5
此构造告诉Cython变量是一个浮点数。 按照相同的原则,变量在C中声明。使用普通的Python,动态定义变量类型。 Cython中使用的显式类型声明使将Python代码转换为C代码成为可能。 关键是在C语言中,必须明确声明变量类型。
Cython的安装非常简单:
pip install cython
Cython中的类型
使用Cython时,可以区分两组类型。 一种是变量,第二种是函数。
如果我们在谈论变量,那么可以使用以下类型:
cdef int a, b, c
cdef char *s
cdef float x = 0.5
(单精度数字)cdef double x = 63.4
(双精度数字)cdef list names
cdef dict goals_for_each_play
cdef object card_deck
请注意,实际上这里显示的是C / C ++类型!
使用函数时,可以使用以下类型:
def
是常规的Python函数,仅从Python调用。cdef
是Cython函数,不能从常规Python代码中调用。 此类功能只能在Cython代码内调用。cpdef
可以从C和Python访问的函数。
现在我们已经弄清楚了Python的类型,我们将加快Python代码的速度。
使用Cython加速代码
让我们从创建Python基准开始。 这将是一个
for
循环,其中将计算数字的阶乘。 相应的纯Python代码如下所示:
def test(x): y = 1 for i in range(1, x+1): y *= i return y
此功能的cython等效于其原始版本。 相应的代码必须放在扩展名为
.pyx
的文件中。 需要对代码进行的唯一更改是将有关变量和函数类型的信息添加到其中:
cpdef int test(int x): cdef int y = 1 cdef int i for i in range(1, x+1): y *= i return y
请注意,该函数之前带有
cpdef
关键字。 这使您可以从Python调用此函数。 另外,将类型分配给变量
i
,变量
i
充当循环计数器。 别忘了我们需要键入函数中声明的所有变量。 这将使C编译器知道要使用的类型。
现在创建
setup.py
,它将帮助我们将Cython代码转换为C代码:
from distutils.core import setup from Cython.Build import cythonize setup(ext_modules = cythonize('run_cython.pyx'))
让我们编译:
python setup.py build_ext --inplace
现在可以使用C代码了。
如果查看Cython代码所在的文件夹,则可以找到运行C代码所需的所有文件,包括
run_cython.c
文件。 如果您有兴趣,请打开此文件,然后查看Cython生成的C代码。
现在您可以测试我们的超快速C代码了。 下面是用于测试和比较程序的两个版本的代码。
import run_python import run_cython import time number = 10 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文件一样,然后我们调用相应的函数,就像我们一直在使用常规的Python函数一样。
看看下表。 您可能会注意到,在所有情况下,该程序的Cython版本都比其Python版本要快。 任务越大,Cython提供的加速度越大。
总结
使用Cython可以大大加快几乎所有用Python编写的代码的速度,而无需付出任何特殊的努力。 程序中循环次数越多,处理的数据越多-您可以从Cython获得更好的结果。
亲爱的读者们! 您在项目中使用Cython吗?
