用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提供了最大的改进。
文章参考于网络,如有侵权,请联系删除
- SpringMVC + Mybatis bug调试 SQL正确,查数据库却返回NULL
- 原生javascript实现图片轮播效果代码
- Spring AOP中 args和arg-names的区别
- Golong 语言开发 go-websocket-sample 测试值得拥有
- Java面试系列23-spring(2)-配置数据库驱动、依赖、Mapping等
- 【Golang语言社区】 Go语言中使用 Protobuf
- Java面试系列21-xml
- tensorflow载入数据的三种方式 之 TF生成数据的方法
- JS游戏开发 可移动地图的实现
- Java面试系列-多线程
- pymongo.errors:Sort operation used more than the maximum 33554432 bytes of RAM. Add an index,
- PG学习初体验--源码安装和简单命令(r8笔记第97天)
- Pymongo: TypeError: if no direction is specified, key_or_list must be an instance of list
- Java面试系列19-Struts2
- 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 数组属性和方法
- IIC设备驱动实例调试
- 并发与竞态(原子操作)
- Docker 入门到实战教程(一)介绍Docker
- Docker 入门到实战教程(二)安装Docker
- Docker 入门到实战教程(三)镜像和容器
- Docker 入门到实战教程(四)容器链接
- Docker 入门到实战教程(五)构建Docker镜像
- Docker 入门到实战教程(六)Docker数据卷
- Docker 入门到实战教程(七)安装Redis
- Docker 入门到实战教程(八)安装Mysql
- Docker 入门到实战教程(九)安装Nginx
- Docker教程(九)部署Spring Boot项目
- Docker 入门到实战教程(十一)部署Vue+SpringBoot 前后端分离项目
- Docker 入门到实战教程(十二)ELK+Filebeat搭建日志分析系统
- Docker 入门到实战教程(十三)Docker Compose