如何让python的运行速度得到提升
python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差。
“一行代码让python的运行速度提高100倍”这绝不是哗众取宠的论调。
我们来看一下这个最简单的例子,从1一直累加到1亿。
最原始的代码:
importtime
deffoo(x,y):
tt=time.time()
s=0
foriinrange(x,y):
s+=i
print('Timeused:{}sec'.format(time.time()-tt))
returns
print(foo(1,100000000))
结果
Timeused:6.779874801635742sec
4999999950000000
是不是快了100多倍呢?
那么下面就分享一下“为啥numba库的jit模块那么牛掰?”
NumPy的创始人Travis Oliphant在离开Enthought之后,创建了CONTINUUM,致力于将Python大数据处理方面的应用。最近推出的Numba项目能够将处理NumPy数组的Python函数JIT编译为机器码执行,从而上百倍的提高程序的运算速度。
Numba项目的主页上有Linux下的详细安装步骤。编译LLVM需要花一些时间。
Windows用户可以从Unofficial Windows Binaries for Python Extension Packages下载安装LLVMPy、meta和numba等几个扩展库。
下面我们看一个例子:
importnumbaasnb
fromnumbaimportjit
@jit('f8(f8[:])')
defsum1d(array):
s=0.0
n=array.shape[0]
foriinrange(n):
s+=array[i]
returns
importnumpyasnp
array=np.random.random(10000)
%timeitsum1d(array)
%timeitnp.sum(array)
%timeitsum(array)
10000loops,bestof3:38.9usperloop
10000loops,bestof3:32.3usperloop
100loops,bestof3:12.4msperloop
numba中提供了一些修饰器,它们可以将其修饰的函数JIT编译成机器码函数,并返回一个可在Python中调用机器码的包装对象。为了能将Python函数编译成能高速执行的机器码,我们需要告诉JIT编译器函数的各个参数和返回值的类型。我们可以通过多种方式指定类型信息,在上面的例子中,类型信息由一个字符串’f8(f8[:])’指定。其中’f8’表示8个字节双精度浮点数,括号前面的’f8’表示返回值类型,括号里的表示参数类型,'[:]’表示一维数组。因此整个类型字符串表示sum1d()是一个参数为双精度浮点数的一维数组,返回值是一个双精度浮点数。
内容扩展:
Python运行速度提升
相比较C,C++,python一直被抱怨运行速度很慢,实际上python的执行效率并不慢,而是解释器Cpython运行效率很差。
通过使用numba库的jit可以让python的运行速度提高百倍以上。
同诺简单累加,相乘的例子,可以看出。
#!/usr/bin/env python
# encoding: utf-8
'''
@author: Victor
@Company:华中科技大学电气学院聚变与等离子研究所
@version: V1.0
@contact: 1650996069@qq.com 2018--2020
@software: PyCharm2018
@file: quickPython3.py
@time: 2018/9/21 20:54
@desc:使用numba的jit是python代码运行速度提高100倍左右
'''
'''平常运行'''
import time
def add(x,y):
tt = time.time()
s = 0
for i in range(x,y):
s += i
print('The time used: {} seconds'.format(time.time()-tt))
return s
add(1,100000000)
##########结果###############
# D:Python3python.exe D:/Pycharm2018Works/InsteringPython3/SomeBasics/quickPython3.py
# The time used: 6.712835788726807 seconds
# Process finished with exit code 0
'''调用numba运行'''
import time
from numba import jit
@jit
def add(x,y):
tt = time.time()
s = 0
for i in range(x,y):
s += i
print('The time used: {} seconds'.format(time.time()-tt))
return s
add(1,100000000)
##########结果###############
# D:Python3python.exe D:/Pycharm2018Works/InsteringPython3/SomeBasics/quickPython3.py
# The time used: 0.06396007537841797 seconds
#
# Process finished with exit code 0
Numba模块能够将处理NumPy数组的Python函数JIT编译为机器码执行,从而上百倍的提高程序的运算速度。
- 【实战】如何使用 Python 从 Redis 中删除 4000万 KEY
- [多图] DevOps 也要懂点 Excel
- [实战篇] Python 运维中使用并发
- PHP数据结构(十) ——有向无环图与拓扑算法
- PHP数据结构(十一) ——图的连通性问题与最小生成树算法(1)
- 优化 MySQL: 3 个简单的小调整
- PHP数据结构(十一) ——图的连通性问题与最小生成树算法(2)
- 进程间通信的历史与未来
- PHP数据结构(十二) ——静态查找表
- 小程序中滚动条的使用,wx.pageScrollTo和<scroll-view>的对比
- 小程序中tabBar的使用
- ubuntu配置虚拟内存
- PHP数据结构(十三) ——动态查找表(二叉排序树)
- Ubuntu下配置JavaWeb开发环境
- 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 数组属性和方法
- linux下C语言实现写日志功能
- centOS7下Spark安装配置教程详解
- linux tail 查看日志文件方法
- Linux下Python脚本自启动和定时启动的详细步骤
- linux后台执行命令&和nohup的具体使用方法
- Linux修改hostname与免密码登录的方法
- Linux启动与停止spring boot工程的脚本示例
- 在Linux上如何检查用户所属组详解
- Linux中移除(删除)符号链接的命令
- Linux定时备份数据库到指定邮箱的方法
- 详解nohup /dev/null 2>&1 含义的使用
- centOS7安装jdk1.8的方法
- 你知道一台Linux服务器可以负载多少个连接吗
- Linux环境下安装Nginx及其使用
- CentOS8中的nmcli使用详解