博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用Cython加速Python代码
阅读量:4359 次
发布时间:2019-06-07

本文共 1514 字,大约阅读时间需要 5 分钟。

安装Cython

pip install Cython

如何使用

要在我们的笔记本中使用Cython,我们将使用IPython magic命令。Magic命令以百分号开始,并提供一些额外的功能,这些功能可以增强工作流。通常,有两种类型的Magic命令:

  1. 行magic由单个“%”表示,并且只在一行输入进行操作

  2. 单元格magic由两个“%”表示,并在多行输入上操作。

让我们开始:

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

%load_ext Cython

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

%%cython

完成这些之后,就可以开始编写Cython代码了。

Cython可以跑多快

与普通Python代码相比,Cython的速度快多少实际上取决于代码本身。例如,如果您正在运行具有许多变量的计算开销较大的循环,Cython将大大优于常规Python代码。递归函数也会使Cython比Python快很多。

让我们用斐波那契数列来证明这一点。简单地说,这个算法通过把前两个数相加找到下一个数。下面是Python中可能出现的情况:

%%cythondef 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)

运行代码:

%%timefibonacci(39)

结果:

CPU times: user 8.39 s, sys: 78.6 ms, total: 8.47 sWall time: 8.43 s39088169

正如所见,找到序列的第39个数字花费了8.39秒,这里Wall time是指从函数调用开始到结束所花费的总时间。

接下来在magic命令行后面添加-a有何不同:

%%cython -adef fibonacci_c(int n):    if n<0:        print("1st fibonacci number = 0")    elif n==1:        return 0    elif n==2:        return 1    else:        return fibonacci_c(n-1)+fibonacci_c(n-2)

运行结果如下:

793818-20190811142913426-1080592296.png
正如您所看到的,通过在magic命令后面添加’ -a ‘,我们收到了一些注释,这些注释向我们展示了代码中有多少Python交互。
这里的目标是去掉所有的黄线,让它们有一个白色的背景。在这种情况下,将不存在Python交互,所有代码都将在C中运行。
您还可以单击每行旁边的“+”符号,查看Python代码的C转换。

运行代码看下能有多快:

%%timefibonacci_c(39)

运行结果如下:

CPU times: user 4.85 s, sys: 49.7 ms, total: 4.9 sWall time: 4.89 s39088169

本例中,Cython的速度大约是Python的5.8倍。这清楚地展示了利用Cython节省时间的能力,与常规Python代码相比,Cython提供了最大的改进。

文章参考于网络,如有侵权,请联系删除

转载于:https://www.cnblogs.com/hankleo/p/11334966.html

你可能感兴趣的文章
2016424王启元 Exp5 msf基础应用
查看>>
Differences between page and segment
查看>>
Jdk与Tomcat配置与安装
查看>>
关于一个Java web与JFrame的深度结合
查看>>
VB连数据库conn.open的参数
查看>>
《信息安全系统设计基础》实验三
查看>>
SpringBoot Docs
查看>>
解决sublime text 2总是在新窗口中打开文件(标签中打开)
查看>>
VUE AntDesign DatePicker设置默认显示当前日期
查看>>
WIN32窗口模板
查看>>
859. Buddy Strings - LeetCode
查看>>
[置顶] 关键字弹出动画
查看>>
支付宝api指南
查看>>
二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式
查看>>
docker-compose部署kafka
查看>>
IOS中NSUserDefaults的用法(轻量级本地数据存储)
查看>>
cms项目技术心得!
查看>>
Django模板系统
查看>>
位(Bit)与字节(Byte)
查看>>
关于两次指针(struct型)传参数的问题
查看>>