大数据文摘出品
编译:啤酒泡泡、宁静
Python是社区里最受喜爱的编程语言!它是目前为止最易使用的语言,因为它的代码短小精悍,符合人们的思维方式,也符合人们的阅读习惯。
但是你会经常听到有人吐槽Python,尤其是有些C语言的大牛吐槽Python速度慢。
他们说得没错,相比其他高级程序设计语言,如C语言来说,Python确实速度很慢,这主要是因为C语言更面向计算机底层,像一些单片机、电路板的设计都使用C语言,C语言和汇编语言之间的转换也更快,但是“every coin has two sides”,没有完美无缺的编程语言,C语言也有着其诸如代码量大、面向过程的一些缺点,如何让Python兼顾C语言速度方面的优点呢?
一个很形象的例子,就像上图展示的一样,赛车手需要兼顾汽车的发动引擎的内耗磨损,也要兼顾赛车的运行速度,那么,如何在两者之间取得平衡呢?
其实有很多可以提高运行速度的办法,比如:
利用多进程库来使用所有的CPU内核;
如果你正在使用NumPy,Pandas,或是Scikit-Learn库,那么可以使用Rapids来提高GPU的处理速度。
但是这只针对你的任务可以并行的情况,例如数据预处理、矩阵操作等,上述办法都很棒,可是如果你只使用纯Python语言,那该怎么办呢?再比如,你必须使用一个很大的for循环,而且因为数据必须被顺序处理导致你无法使用矩阵,在这种情况下,有没有办法提高Python本身的速度呢?
Cython就是用来加速纯Python代码的。
什么是Cython?
什么是Cython?
从本质上讲,Cython是Python和C/C++的桥梁。它允许你对Python代码稍作修改,然后把Python代码直接翻译成C语言代码。
你唯一需要修改Python代码的地方就是在每一个变量前面加上它的类型,通常,我们在Python里会这样声明变量:
x = 0.5
如果使用Cython,我们会给变量加上它的类型:
cdef float x = 0.5
这会告诉Cython,我们的变量是浮点型变量,这和我们在C语言中的操作一样。使用纯Python语言,变量的数据类型在赋值后被自动定义。Cython这种显式的变量声明方法使得Python代码转换成C代码成为可能,因为C语言要求变量的数据类型必须在声明变量时写出来。
使用pip安装Cython只需一行代码:
pip install cython
Cython的数据类型
Cython的数据类型
使用Cython时,Cython提供两类类型,一类用于变量,一类用于函数。
对于变量,我们可以这样写(请注意,这些类型都来自C/C++):
-
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
-
def – 普通的Python函数,只用Python解释器 -
cdef – Cython专用函数,不能通过纯Python代码使用该函数,必须在Cython内使用 -
cpdef – C语言和Python共用。 可以通过C语言或者Python代码使用该函数
使用Cython提高代码的运行速度
def test(x):
y = 1
for i in range(1, x+1):
y *= i
return y
cpdef