用Cython加速Python代码
安装Cython
pip install Cython
如何使用
要在我们的笔记本中使用Cython,我们将使用IPython magic命令。Magic命令以百分号开始,并提供一些额外的功能,这些功能可以增强工作流。通常,有两种类型的Magic命令:
- 行magic由单个“%”表示,并且只在一行输入进行操作
- 单元格magic由两个“%”表示,并在多行输入上操作。
让我们开始:
首先,为了能够使用Cython,我们必须运行:
%load_ext Cython
现在,每当我们想在代码单元中运行Cython时,我们必须首先将以下magic命令放入单元格:
%%cython
完成这些之后,就可以开始编写Cython代码了。
Cython可以跑多快
与普通Python代码相比,Cython的速度快多少实际上取决于代码本身。例如,如果您正在运行具有许多变量的计算开销较大的循环,Cython将大大优于常规Python代码。递归函数也会使Cython比Python快很多。
让我们用斐波那契数列来证明这一点。简单地说,这个算法通过把前两个数相加找到下一个数。下面是Python中可能出现的情况:
%%cython
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(39)
结果:
CPU times: user 8.39 s, sys: 78.6 ms, total: 8.47 s
Wall time: 8.43 s
39088169
正如所见,找到序列的第39个数字花费了8.39秒,这里Wall time是指从函数调用开始到结束所花费的总时间。 接下来在magic命令行后面添加-a有何不同:
%%cython -a
def 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)
运行结果如下:
正如您所看到的,通过在magic命令后面添加’ -a ‘,我们收到了一些注释,这些注释向我们展示了代码中有多少Python交互。 这里的目标是去掉所有的黄线,让它们有一个白色的背景。在这种情况下,将不存在Python交互,所有代码都将在C中运行。 您还可以单击每行旁边的“+”符号,查看Python代码的C转换。
运行代码看下能有多快:
%%time
fibonacci_c(39)
运行结果如下:
CPU times: user 4.85 s, sys: 49.7 ms, total: 4.9 s
Wall time: 4.89 s
39088169
本例中,Cython的速度大约是Python的5.8倍。这清楚地展示了利用Cython节省时间的能力,与常规Python代码相比,Cython提供了最大的改进。
文章参考于网络,如有侵权,请联系删除
- Java高级进阶:自定义ClassLoader
- 字符串拼接+和concat的区别
- Spring Boot Runner启动器
- Spring Boot自动配置原理、实战
- Spring Aware容器感知技术
- 深入探究frame和bounds的区别以及setbounds使用
- 如何生成二维码过程详解
- hashCode和identityHashCode的区别你知道吗?
- SpringCloud注册中心高可用搭建
- SpringMVC表单验证器的使用
- Hadoop作业提交与执行源码分析
- 一分钟开启Tomcat https支持
- Spring Enable*高级应用及原理
- 各hbase版本对hadoop各版本的支持情况
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- gearman中worker常驻后台,导致MySQL server has gone away的解决方法
- php 使用html5 XHR2实现上传文件与进度显示功能示例
- php高性能日志系统 seaslog 的安装与使用方法分析
- PHP实现文件上传后台处理脚本
- 让whoops帮我们告别ThinkPHP6的异常页面
- PHP实现文件上传操作和封装
- gearman中任务的优先级和返回状态实例分析
- php实现文件上传基本验证
- php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
- php使用fputcsv实现大数据的导出操作详解
- php的无刷新操作实现方法分析
- PHP实现创建一个RPC服务操作示例
- php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
- gearman管理工具GearmanManager的安装与php使用方法示例
- php 的多进程操作实践案例分析