提升675倍利用Cython为Pyt

早期白癜风 http://pf.39.net/bdfyy/zqbdf/index.html

全文共字,预计学习时长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代码了。

图片来源:pixabay

Cython能有多快?

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许多进一步优化代码的功能。

留言点赞


转载请注明:http://www.aierlanlan.com/rzgz/5109.html