<<返回python首页 python

《Python 应用案例》

使用Cython提升Python运行效率

有一些方法可以提高Python编写过代码的效率,但它很可能仍然比C代码慢。这主要是因为为Python是一种动态编程语言,并将许多C在编译期间负责的事情转移到运行。本节我们介绍如何使用Cython,Cython会将Python代码转换为C,通常会大大加快速度。虽然Cython本身是独立的编程语言,但它很容易合并到你的工作流程中。

img

安装Cython

为了能够使用Cython,你需要一个C编译器。因此安装过程因您当前的操作系统而异。

对于Linux,通常有GNU C编译器(gncc)。对于Mac OS,你可以下载Xcode来获取gncc。如果您应该使用Windows,那么安装过程会有点复杂。更多信息请访问Cython的GitHub:

https://github.com/cython/cython/wiki/InstallingOnWindows

在线云环境中,您只需要使用pip安装即可。

!pip3 install Cython -i https://pypi.tuna.tsinghua.edu.cn/simple

如何使用Cython

展示Cython功能的最简单方法是通过Jupyter notebook。这里有Jupyter Notebook的基本教程

要在我们的notebook中使用Cython,我们将使用IPython magic命令。Magic命令以百分号开始,并提供一些额外的特性,以增强您的工作流程。一般来说,有两种类型的magic命令:

  • 行magic由一个“%”表示,只对一行输入进行操作
  • 单元格magic由两个“%”表示,并对多行输入进行操作。

让我们开始:

首先,为了能够使用Cython,我们必须运行:

%load_ext Cython 

然后,每当我们想在一个代码单元中运行Cython时,我们必须首先在单元格中放入以下magic命令:

一旦您完成了这些,您就可以开始使用Cython进行编码了。

%%cython
#cython code here

定义普通的Python函数

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) 
%%time
fibonacci(40)

如您所见,查找序列中的第40个数字花费。这里的Wall time指的是函数调用从开始到结束所花费的总时间。

以下是参考的运行时间

CPU times: user 38.8 s, sys: 6.92 ms, total: 38.8 s
Wall time: 1min 18s

在Cython中定义相同的函数

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

我们在上面使用了一些Jupyter Notebook单元格的magic,允许我们在这个单元格中使用Cython。然后,我们基本上采用与上面相同的代码,除了现在我们能够使用静态类型声明并将n定义为integer类型。

命令之后添加“-a”,我们收到了注释,这些注释显示了代码中有多少Python交互。这里的目标是去掉所有的黄线,用白色的背景代替。在这种情况下,没有Python交互,所有代码都将在C中运行。您还可以单击每一行旁边的“+”符号,查看Python代码的C语言翻译。

速度比较

%%time
fibonacci_cython(40)

时间参考

CPU times: user 10.3 s, sys: 84.2 ms, total: 10.4 s
Wall time: 21 s
63245986

简单总结:

在这种情况下,Cython大约比Python快6倍左右。这清楚地展示了利用Cython的节省时间的能力,在这方面,Cython提供了比常规Python代码更好的改进。可以使用Cython加速项目中常用且效率较低的Python代码

移动端设备除iPad Pro外,其它移动设备仅能阅读基础的文本文字。
建议使用PC或笔记本电脑,浏览器使用Chrome或FireFox进行浏览,以开启左侧互动实验区来提升学习效率,推荐使用的分辨率为1920x1080或更高。
我们坚信最好的学习是参与其中这一理念,并致力成为中文互联网上体验更好的学练一体的IT技术学习交流平台。
您可加QQ群:575806994,一起学习交流技术,反馈网站使用中遇到问题。
内容、课程、广告等相关合作请扫描右侧二维码添加好友。

狐狸教程 Copyright 2021

进入全屏