【导读】如果你用过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 0
elif n == 2:
return 1
else:
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中。
%%cython
cdef 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+位同学在学习,现在报名,限时优惠!网易云课堂人工智能畅销榜首位!
点击“阅读原文”,了解报名专知《深度学习:算法到实战》课程