Python代码加速利器:Cython

【导读】如果你用过Python,你可能会发现它比想象中运行的慢,尤其是与C语言相比。这主要是因为Python是一种动态编程语言,然而C语言很多操作是在编译时就完成了。但也不是没有办法,Cython可以很好解决你的痛点。


Cython是结合了Python和C的语法的一种语言,可以简单的认为就是给Python加上了静态类型后的语法,使用者可以维持大部分的Python语法,而不需要大幅度调整主要的程式逻辑与算法。但由于会直接编译为二进制程序,所以性能较Python会有很大提升。然Cython本身是一种单独的编程语言,但很容易将其整合到例如Jupyter笔记本工作流程。在执行时,Cython将您的Python代码转换为C,通常会大大加快它的速度。


安装Cython

首先你需要你要C编译器。对于Linux,通常使用GNU C编译器(gncc)。对于Mac OS,您可以下载Xcode以获取gncc。而Windows 桌面系统下安装C编译器会更复杂。


有了C编译器之后,你只需运行:

pip install Cython


如何使用Cython

我们将在IPython中演示Cython。

我们首先介绍IPython Magic命令。Magic命令以百分号开头,通常有2种类型:

  • 单行Magic由单个'%'表示,并且仅在一行输入上操作

  • 单元格Magic用两个'%'表示,并在多行输入上操作。


首先运行下列语句引入Cython:

%load_ext Cython

然后,当运行Cython代码时,我们需要加入以下Cython 代码:

%%cython

然后就可以愉快地使用Cython了。


Cython的速度有多快?

Cython 主要优化的是循环与递归。


让我们用斐波那契数列来证明这一点。数列中下一个数字是前两项之和,用如下代码在Python中实现斐波那契数列:


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


使用Python:

如上图所示,在序列中找到第39个数字需要13.3秒。此处的挂起时间是指从调用该函数开始到结束所用的总时间。

让我们在Cython中定义相同的函数。

其实只是在第一行加入了

%%cython -a

加入“-a”之后,我们可以看出是Python中哪些代码比较耗时了,加入“%%cython” 之后,这些代码都将在C语言下运行。你还可以单击每行旁边的“+”符号以查看Python代码的C转换。

这段代码有多快?我们来看看:

在这种情况下,Cython比Python快约6.75倍。这清楚地展示了利用Cython节省时间的能力,它提供了比常规Python代码最大的改进。


其他选项

如果你熟悉C的使用,Cython还允许访问C代码,Cython的编写者尚未添加即用型声明。例如,使用以下代码,您可以为C函数生成Python包装器并将其添加到模块dict中。

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

Cython还有许多其他功能,例如并行。


结论

如果您有时遇到不得不等待太长时间才能执行Python代码的问题,Cython提供了一种非常整齐且高效的方法来加速您的代码。最重要的是,如果您对C语言稍微熟悉,它提供了许多进一步优化代码的功能。我绝对建议您仔细查看文档。 


原文链接:

https://towardsdatascience.com/speed-up-your-python-code-with-cython-8879105f2b6f

-END-

专 · 知

专知,专业可信的人工智能知识分发,让认知协作更快更好!欢迎登录www.zhuanzhi.ai,注册登录专知,获取更多AI知识资料!

欢迎微信扫一扫加入专知人工智能知识星球群,获取最新AI专业干货知识教程视频资料和与专家交流咨询

请加专知小助手微信(扫一扫如下二维码添加),加入专知人工智能主题群,咨询技术商务合作~

专知《深度学习:算法到实战》课程全部完成!550+位同学在学习,现在报名,限时优惠!网易云课堂人工智能畅销榜首位!

点击“阅读原文”,了解报名专知《深度学习:算法到实战》课程

展开全文
Top
微信扫码咨询专知VIP会员