python可以提高程序执行速度N倍你知道吗?
1.1。Numba的约5分钟指南
Numba是Python的即时编译器,它最适用于使用NumPy数组和函数以及循环的代码。使用Numba的最常用方法是通过其装饰器集合,可以应用于您的函数来指示Numba编译它们。当调用Numba修饰函数时,它被编译为机器代码“及时”执行,并且您的全部或部分代码随后可以以本机机器代码速度运行!
开箱即用的Numba使用以下方法:
- 操作系统:Windows(32位和64位),OSX和Linux(32位和64位)
- 架构:x86,x86_64,ppc64le。在armv7l,armv8l(aarch64)上进行实验。
- GPU:Nvidia CUDA。AMD ROC的实验。
- CPython的
- NumPy 1.10 - 最新
1.1.1。我怎么得到它?
Numba可作为畅达包为 蟒蛇Python发布:
$ conda install numba
Numba还有pip可供选择:
$ pip install numba
Numba也可以 从源代码编译,虽然我们不建议首次使用Numba用户。
Numba通常用作核心包,因此其依赖性保持在绝对最小值,但是,可以按如下方式安装额外的包以提供其他功能:
scipy
- 支持编译numpy.linalg
功能。colorama
- 支持回溯/错误消息中的颜色突出显示。pyyaml
- 通过YAML配置文件启用Numba配置。icc_rt
- 允许使用Intel SVML(高性能短矢量数学库,仅限x86_64)。安装说明在 性能提示中。
1.1.2。Numba会为我的代码工作吗?
这取决于你的代码是什么样的,如果你的代码是以数字为导向的(做了很多数学运算),经常使用NumPy和/或有很多循环,那么Numba通常是一个不错的选择。在这些例子中,我们将应用最基本的Numba的JIT装饰器,@jit
试图加速一些函数来演示哪些有效,哪些无效。
Numba在代码看起来像这样:
from numba import jit
import numpy as np x = np.arange(100).reshape(10, 10) @jit(nopython=True) # Set "nopython" mode for best performance
def go_fast(a): # Function is compiled to machine code when called the first time
trace = 0
for i in range(a.shape[0]): # Numba likes loops
trace += np.tanh(a[i, i]) # Numba likes NumPy functions
return a + trace # Numba likes NumPy broadcasting print(go_fast(x))
对于看起来像这样的代码,如果有的话,它将无法正常工作:
from numba import jit
import pandas as pd x = {'a': [1, 2, 3], 'b': [20, 30, 40]} @jit
def use_pandas(a): # Function will not benefit from Numba jit
df = pd.DataFrame.from_dict(a) # Numba doesn't know about pd.DataFrame
df += 1 # Numba doesn't understand what this is
return df.cov() # or this! print(use_pandas(x))
请注意,Numba不理解Pandas,因此Numba只是通过解释器运行此代码,但增加了Numba内部开销的成本!
1.1.3。什么是nopython
模式?
Numba @jit
装饰器从根本上以两种编译模式运行, nopython
模式和object
模式。在go_fast
上面的例子中, nopython=True
在@jit
装饰器中设置,这是指示Numba在nopython
模式下操作。nopython
编译模式的行为本质上是编译装饰函数,以便它完全运行而不需要Python解释器的参与。这是使用Numba jit
装饰器的推荐和最佳实践方式,因为它可以带来最佳性能。
如果编译nopython
模式失败,Numba可以编译使用 ,如果没有设置,这是装饰器的 后退模式(如上例所示)。在这种模式下,Numba将识别它可以编译的循环并将它们编译成在机器代码中运行的函数,并且它将运行解释器中的其余代码。为获得最佳性能,请避免使用此模式objectmode
@jit
nopython=True
use_pandas
1.1.4。如何衡量Numba的表现?
首先,回想一下,Numba必须为执行函数的机器代码版本之前给出的参数类型编译函数,这需要时间。但是,一旦编译完成,Numba会为所呈现的特定类型的参数缓存函数的机器代码版本。如果再次使用相同的类型调用它,它可以重用缓存的版本而不必再次编译。
测量性能时,一个非常常见的错误是不考虑上述行为,并使用一个简单的计时器来计算一次,该计时器包括在执行时编译函数所花费的时间。
例如:
from numba import jit
import numpy as np
import time x = np.arange(100).reshape(10, 10) @jit(nopython=True)
def go_fast(a): # Function is compiled and runs in machine code
trace = 0
for i in range(a.shape[0]):
trace += np.tanh(a[i, i])
return a + trace # DO NOT REPORT THIS... COMPILATION TIME IS INCLUDED IN THE EXECUTION TIME!
start = time.time()
go_fast(x)
end = time.time()
print("Elapsed (with compilation) = %s" % (end - start)) # NOW THE FUNCTION IS COMPILED, RE-TIME IT EXECUTING FROM CACHE
start = time.time()
go_fast(x)
end = time.time()
print("Elapsed (after compilation) = %s" % (end - start))
这,例如打印:
Elapsed (with compilation) = 0.33030009269714355
Elapsed (after compilation) = 6.67572021484375e-06
衡量Numba JIT对您的代码的影响的一个好方法是使用timeit模块函数来执行时间,这些函数测量多次执行迭代,因此可以在第一次执行时适应编译时间。
作为旁注,如果编译时间成为问题,Numba JIT支持 编译函数的磁盘缓存,并且还具有Ahead-Of-Time编译模式。
1.1.5。它有多快?
假设Numba可以在nopython
模式下运行,或者至少编译一些循环,它将针对您的特定CPU进行编译。加速因应用而异,但可以是一到两个数量级。Numba有一个 性能指南,涵盖了获得额外性能的常用选项。
1.1.6。Numba如何运作?
Numba读取装饰函数的Python字节码,并将其与有关函数输入参数类型的信息相结合。它分析并优化您的代码,最后使用LLVM编译器库生成函数的机器代码版本,根据您的CPU功能量身定制。每次调用函数时都会使用此编译版本。
1.1.7。其他感兴趣的东西:
Numba有相当多的装饰,我们看到@jit
和@njit
,但也有:
@vectorize
- 生成NumPyufunc
(ufunc
支持所有方法)。文件在这里。@guvectorize
- 产生NumPy广义ufunc
s。 文件在这里。@stencil
- 将函数声明为类似模板操作的内核。 文件在这里。@jitclass
- 对于jit感知类。文件在这里。@cfunc
- 声明一个函数用作本机回调(从C / C ++等调用)。文件在这里。@overload
- 注册您自己的函数实现,以便在nopython模式下使用,例如@overload(scipy.special.j0)
。 文件在这里。
一些装饰者提供额外选项:
ctypes / cffi / cython互操作性:
1.1.7.1。GPU目标:
Numba可以针对Nvidia CUDA和(实验性)AMD ROC GPU。您可以使用纯Python编写内核,让Numba处理计算和数据移动(或明确地执行此操作)。单击关于CUDA或ROC的 Numba文档 。
示例:接下来我们写一段简单的代码,来计算一下执行时间:
示例1:不使用numba的:
import time def num(): arr = []
for i in range(10000000):
arr.append(i) stime = time.time()
num()
etime = time.time() - stime
# print(arr)
print('用时:{}秒'.format(etime))
示例输出时间:
用时:1.4500024318695068秒
示例2:使用numba @jit
import time
from numba import jit @jit
def num(): arr = []
for i in range(10000000):
arr.append(i) stime = time.time()
num()
etime = time.time() - stime
# print(arr)
print('用时:{}秒'.format(etime))
示例输出:
用时:0.5530002117156982秒
结论:
上述两个示例代码,一个使用了numba,另一个没有使用numba;可以看出使用numba @jit装饰后,时间明显快了很多倍。
这只是一个简单示例;对于复杂计算提高速度更明显。
python可以提高程序执行速度N倍你知道吗?的更多相关文章
- Oracle数据库学习之存储过程--提高程序执行的效率
存储过程是Oracle开发者在数据转换或查询报表时经常使用的方式之一.它就是想编程语言一样一旦运行成功,就可以被用户随时调用,这种方式极大的节省了用户的时间,也提高了程序的执行效率.存储过程在数据库开 ...
- JS基础_质数练习的改进,提高程序执行效率
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 压缩JS,提高代码执行速度
压缩JS java -jar yuicompressor-2.4.jar --type js xxx.js -o xxx.js --charset utf-8 压缩CSS java -jar yuic ...
- JavaScript代码优化(下载时间和执行速度优化)
JavaScript代码的速度被分成两部分:下载时间和执行速度. 下载时间 Web浏览器下载的是js源码,因此所有长变量名和注释都回包含在内.这个因素会增加下载时间.1160是一个TCP-IP包中的字 ...
- 采用Psyco实现python执行速度提高到与编译语言一样的水平
本文实例讲述了采用Psyco实现python执行速度提高到与编译语言一样的水平的方法,分享给大家供大家参考.具体实现方法如下: 一.安装Psyco很简单,它有两种安装方式,一种是源码方式,一种是二进制 ...
- 一行代码让你的python运行速度提高100倍
转自:https://www.cnblogs.com/xihuineng/p/10630116.html 加上之后运行速度快了十倍,我的天呐. python一直被病垢运行速度太慢,但是实际上pytho ...
- 解读30个提高Web程序执行效率的好经验
其实微博是个好东西,关注一些技术博主之后,你不用再逛好多论坛了,因为一些很好的文章微博会告诉你,最近看到酷勤网推荐的一篇文章<30个提高Web程序执行效率的好经验>,文章写得不错,提到一些 ...
- (转)对《30个提高Web程序执行效率的好经验》的理解
阅读了博客园发布的IT文章<30个提高Web程序执行效率的好经验>,这30条准则对我们web开发是非常有用的,不过大家可能对其中的一些准则是知其然而不知其所以然. 下面是我对这些准则的理解 ...
- python笔记:#006#程序执行原理
程序执行原理(科普) 目标 计算机中的 三大件 程序执行的原理 程序的作用 01. 计算机中的三大件 计算机中包含有较多的硬件,但是一个程序要运行,有 三个 核心的硬件,分别是: CPU 中央处理器, ...
随机推荐
- ssl证书专题(3):创建CA和申请证书
请看: https://www.cnblogs.com/mingzhang/p/8949541.html
- JS变量重复声明以及忽略var 声明的问题及其背后的原理
腾讯的一个笔试题,先看一下 var a = 100; function fn() { alert(a); //undefined var a = 200; alert(a); //200 } fn() ...
- 修改终端terminal
修改终端路径 显示的颜色 (1)在home目录中,新建 .dircolors: $vi .dircolors 输入下面内容 DIR 00;36 保存退出. (2)在 .bashrc文件中 $vi .b ...
- Physics Experiment 弹性碰撞 [POJ3684]
题意 有一个竖直的管子内有n个小球,小球的半径为r,最下面的小球距离地面h高度,让小球每隔一秒自由下落一个,小球与地面,小球与小球之间可视为弹性碰撞,让求T时间后这些小球的分布 Input The f ...
- react-native获取设备信息组件(react-native-device-info)
转载链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/react-native-acquisition-device-infor ...
- CSS3_盒阴影_倒影_盒子大小可调
1. 盒阴影 会产生一个或者多个阴影 使用: (多个阴影,以逗号隔开) /* (不能为负值) (可以负值) */ /* 水平方向偏移量 垂直反向偏移量 模糊程度 扩散程度 颜色 是否是内阴影; ...
- php的imagick模块扩展
imagick模块介绍 ImageMagick是一个用于查看.编辑位图文件以及进行图像格式转换的开放源代码软件套装.它可以读取.编辑超过100种图象格式,可用来替换GD库. 安装 在加载模 ...
- JS-函数的构造函数Function
## 在js中使用Function可以实例化函数对象,也就是说在js中函数和普通对象一样. 函数在Js中是比较特殊的,拥有很多功能. 1,函数是对象,就可以使用对象的动态特性. 2,函数是对象,就有 ...
- Educational Codeforces Round 5
616A - Comparing Two Long Integers 20171121 直接暴力莽就好了...没什么好说的 #include<stdlib.h> #include&l ...
- mongodb聚合命令
聚合aggregate 聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成管道,可以对每个阶段的管道进行分组.过滤等功能,然后经过一系列的处理,输出相应的 ...