提升6.75倍!利用Cython为Python代码加速

518 阅读4分钟

全文共2012字,预计学习时长4分钟

图片来源:Unsplash

如果你曾经用Python编写过代码,可能会发现等待某些代码块执行的时间比预期要长。尽管可以通过一些方法提高其代码效率,但它的反应速度仍然比C语言慢。这主要归结于Pyhton是一种动态程序语言,在运行时执行很多任务,而C语言在编译期间便已经执行。

如果你很享受用Python编写代码,但又希望可以提高效率,那么可以考虑一下使用Cython。Cython是一种独立编程语言,可以很容易地并入类似于Jupyter笔记本之类的工作流之中。在执行过程中,Cython会将Python代码转换为C语言,从而大大提高其运行速度。

安装Cython

使用Cython需要安装C语言编译器,因此,安装过程会根据你当前的操作系统而有所不同。对于Linux操作系统,通常需要安装GNU C语言编译器(gncc)。对于Mac操作系统,则需要通过下载Xcode来安装gncc。对于Windows操作系统,安装程序会稍微有点复杂。

安装传送门:

Mac:https://developer.apple.com/

Windows:file://localhost/C/%5CUsers%5C93954%5CDocuments%5CWeChat%20Files%5CWXYHYSFY_1816%5CFileStorage%5CFile%5C2019-07%5CCython%20GitHub

安装C语言编译器之后,下面需要的就是在终端运行。

如何使用Cython

通过Jupyter笔记本演示Cython的功能是最简单的方法。要在笔记本中使用Python,需要运用IPython的魔术命令。该命令以百分号开始,提供附加功能用以增强工作流。通常,魔术命令分为两种类型:

1. Line Magic以一个%开头,且仅能作用于一行代码。

2. Cell Magic以两个%开头,可以作用于多行代码。

具体流程如下:

首先,为了启用Cython,需要执行命令

%load_extCython

每当想要在单元格中运行Cython时,需要先在单元格中输入下面的魔术命令

%%cython

完成上述操作之后,便可以开始编写Cython代码了。

图片来源:pixabay

Cython能有多快?

Cython能比常规Python代码快多少实际上取决于代码本身。例如,如果运行成本较高的多变量循环,Cython明显优于常规的Python代码。递归函数同样使得Cython快于Python。

用斐波那契数列来演示一下。简单来说,这一算法通过将前两个数相加从而找到下一个数。下面是在Python中示范:

def fibonacci(n):    
if n < 0:        
print("1st fibonacci number = 0")    
elif n == 1:        
return 0    
elif n == 2:        
return 1    
else:        
return fibonacci(n-1) + fibonacci(n-2)

让我们来启动Python:

可以看到,找到序列中第39个数用了13.3秒。挂钟时间在这里指的是从函数调用开始到结束所需的总时间。

在Cython中定义相同的函数:

那么发生了什么呢?可以看到,在顶端执行cell magic命令,从而使得Cython可以应用于这个单元格。我将简要介绍“-a”的作用,接着,使用与之前基本一样的代码。唯一的不同之处在于此处可以使用静态类型声明,并将n定义为整数。

可以看到,通过在魔术命令后添加“-a”,能够接收到一些标注,这些标注反映了代码中有多少Python交互。这一代码的目的在于去掉所有黄线并加上白色背景,因而此处不存在Python交互,所有代码都在C语言中执行。你还可以单击每行旁边的“+”查看Python代码的C语言翻译。

这一代码能有多快呢?我们一起看看:

在本例中,Cython的速度大约是Python的6.75倍,这清楚地展示了Cython能够大大节约时间。这一点也是Cython相比于Python最大的改进之处。

附加选项

如果你对C语言已经有所了解,Cython还允许访问C代码,而Cython的创建者还没有为这些代码添加现成的声明。那么,使用以下代码可以为C函数生成Python包装器并将其添加到模块dict中。

%%cython
cdef extern from "math.h":    
cpdef double sin(double x)

Cython证明了并行性等许多额外的功能。

传送门:http://docs.cython.org/en/latest/index.html

总之,如果你遇到在执行Python代码时等待时间过长的问题,Cython可以提供一种集成而高效的方法来加速代码执行速度。更重要的是,如果你熟悉C语言,就可以使用Cython许多进一步优化代码的功能。

留言 点赞 关注

我们一起分享AI学习与发展的干货

欢迎关注全平台AI垂类自媒体 “读芯术”

(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)