全文共字,预计学习时长4分钟
图片来源:Unsplash如果你曾经用Python编写过代码,可能会发现等待某些代码块执行的时间比预期要长。尽管可以通过一些方法提高其代码效率,但它的反应速度仍然比C语言慢。这主要归结于Pyhton是一种动态程序语言,在运行时执行很多任务,而C语言在编译期间便已经执行。
如果你很享受用Python编写代码,但又希望可以提高效率,那么可以考虑一下使用Cython。Cython是一种独立编程语言,可以很容易地并入类似于Jupyter笔记本之类的工作流之中。在执行过程中,Cython会将Python代码转换为C语言,从而大大提高其运行速度。
安装Cython
使用Cython需要安装C语言编译器,因此,安装过程会根据你当前的操作系统而有所不同。对于Linux操作系统,通常需要安装GNUC语言编译器(gncc)。对于Mac操作系统,则需要通过下载Xcode来安装gncc。对于Windows操作系统,安装程序会稍微有点复杂。
安装C语言编译器之后,下面需要的就是在终端运行。
如何使用Cython
通过Jupyter笔记本演示Cython的功能是最简单的方法。要在笔记本中使用Python,需要运用IPython的魔术命令。该命令以百分号开始,提供附加功能用以增强工作流。通常,魔术命令分为两种类型:
1.LineMagic以一个%开头,且仅能作用于一行代码。
2.CellMagic以两个%开头,可以作用于多行代码。
具体流程如下:
首先,为了启用Cython,需要执行命令
%load_extCython
每当想要在单元格中运行Cython时,需要先在单元格中输入下面的魔术命令
%%cython
完成上述操作之后,便可以开始编写Cython代码了。
图片来源:pixabayCython能有多快?
Cython能比常规Python代码快多少实际上取决于代码本身。例如,如果运行成本较高的多变量循环,Cython明显优于常规的Python代码。递归函数同样使得Cython快于Python。
用斐波那契数列来演示一下。简单来说,这一算法通过将前两个数相加从而找到下一个数。下面是在Python中示范:
deffibonacci(n):
ifn0:print(1stfibonaccinumber=0)
elifn==1:return0
elifn==2:return1
else:returnfibonacci(n-1)+fibonacci(n-2)
让我们来启动Python:
可以看到,找到序列中第39个数用了13.3秒。挂钟时间在这里指的是从函数调用开始到结束所需的总时间。
在Cython中定义相同的函数:
那么发生了什么呢?可以看到,在顶端执行cellmagic命令,从而使得Cython可以应用于这个单元格。我将简要介绍“-a”的作用,接着,使用与之前基本一样的代码。唯一的不同之处在于此处可以使用静态类型声明,并将n定义为整数。
可以看到,通过在魔术命令后添加“-a”,能够接收到一些标注,这些标注反映了代码中有多少Python交互。这一代码的目的在于去掉所有黄线并加上白色背景,因而此处不存在Python交互,所有代码都在C语言中执行。你还可以单击每行旁边的“+”查看Python代码的C语言翻译。
这一代码能有多快呢?我们一起看看:
在本例中,Cython的速度大约是Python的6.75倍,这清楚地展示了Cython能够大大节约时间。这一点也是Cython相比于Python最大的改进之处。
附加选项
如果你对C语言已经有所了解,Cython还允许访问C代码,而Cython的创建者还没有为这些代码添加现成的声明。那么,使用以下代码可以为C函数生成Python包装器并将其添加到模块dict中。
%%cython
cdefexternfrommath.h:cpdefdoublesin(doublex)
Cython证明了并行性等许多额外的功能。
总之,如果你遇到在执行Python代码时等待时间过长的问题,Cython可以提供一种集成而高效的方法来加速代码执行速度。更重要的是,如果你熟悉C语言,就可以使用Cython许多进一步优化代码的功能。
留言点赞