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在代码看起来像这样:
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
from numba import jit
import numpy as np
x = np.arange(100).reshape(10, 10)
@jit(nopython=True)
def go_fast(a):
trace = 0
for i in range(a.shape[0]):
trace += np.tanh(a[i, i])
return a + trace
print(go_fast(x))
对于看起来像这样的代码,如果有的话,它将无法正常工作:
from numba import jit
import pandas as pd
x = {'a': [1, 2, 3], 'b': [20, 30, 40]}
def use_pandas(a):
df = pd.DataFrame.from_dict(a)
df += 1
return df.cov()
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@jitnopython=Trueuse_pandas
1.1.4。如何衡量Numba的表现?
首先,回想一下,Numba必须为执行函数的机器代码版本之前给出的参数类型编译函数,这需要时间。但是,一旦编译完成,Numba会为所呈现的特定类型的参数缓存函数的机器代码版本。如果再次使用相同的类型调用它,它可以重用缓存的版本而不必再次编译。
测量性能时,一个非常常见的错误是不考虑上述行为,并使用一个简单的计时器来计算一次,该计时器包括在执行时编译函数所花费的时间。
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
from numba import jit
import numpy as np
import time
x = np.arange(100).reshape(10, 10)
@jit(nopython=True)
def go_fast(a):
trace = 0
for i in range(a.shape[0]):
trace += np.tanh(a[i, i])
return a + trace
start = time.time()
go_fast(x)
end = time.time()
print("Elapsed (with compilation) = %s" % (end - start))
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- 生成NumPy ufunc(ufunc支持所有方法)。文件在这里。
- @guvectorize- 产生NumPy广义ufuncs。 文件在这里。
- @stencil - 将函数声明为类似模板操作的内核。 文件在这里。
- @jitclass - 对于jit感知类。文件在这里。
- @cfunc - 声明一个函数用作本机回调(从C / C ++等调用)。文件在这里。
- @overload- 注册您自己的函数实现,以便在nopython模式下使用,例如@overload(scipy.special.j0)。 文件在这里。
一些装饰者提供额外选项:
- parallel = True- 启用功能的 自动并行化。
- fastmath = True- 为该功能启用快速数学行为。
ctypes / cffi / cython互操作性:
- cffi- 模式支持调用CFFI函数nopython。
- ctypes- 模式支持调用ctypes包装函数nopython。。
- Cython导出的函数是可调用的。
1.1.7.1。GPU目标:
Numba可以针对Nvidia CUDA和(实验性)AMD ROC GPU。您可以使用纯Python编写内核,让Numba处理计算和数据移动(或明确地执行此操作)。单击关于CUDA或ROC的 Numba文档 。
示例:接下来我们写一段简单的代码,来计算一下执行时间:
示例1:不使用numba的:
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
import time
def num():
arr = []
for i in range(10000000):
arr.append(i)
stime = time.time()
num()
etime = time.time() - stime
print('用时:{}秒'.format(etime))
示例输出时间:
用时:1.4500024318695068秒
示例2:使用numba @jit
import time
from numba import jit
def num():
arr = []
for i in range(10000000):
arr.append(i)
stime = time.time()
num()
etime = time.time() - stime
print('用时:{}秒'.format(etime))
示例输出:
用时:0.5530002117156982秒
上述两个示例代码,一个使用了numba,另一个没有使用numba;可以看出使用numba @jit装饰后,时间明显快了很多倍。
这只是一个简单示例;对于复杂计算提高速度更明显。
原文链接:https://www.jianshu.com/u/8f2987e2f9fb
你好,我是 zhenguo今天总结3个提升Python运行速度的方法,只从代码本身考虑,提升运行速度并不会从编写C扩展的代码、基于JIT的编译器技术考虑。关于代码执行效率的第一个方法是减...
发现如果python代码正常运行,然后在python函数中运行,则在后一种情况下运行速度更快。我想知道为什么python代码在函数中运行得更快。通常发现在python函数中存储局部变量要比全局变量更快。可以解释如下。除了局部/全局变量存储时间外,操作码预测还使函数运行更快。CPython是我们从Python.org下载的原始Python实现。它被称为CPython,以将其与更高版本的Python实...
Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足。但是,有很多时候,Python 的效率并没有想象中的那么夸张。本文对一些 Python 代码加速运行的技巧进行整理。
代码优化原则
本文会介绍不少的 Python 代码加速运行的技巧。在深入代码优化细节之前,需要了解一些代码优化基本原则。
第一个基本原则是不要过早优化。很多人一开始写代码就奔着性能优化的目标,“让正确的程序更快要比让快速的程序正确容易得多”。因此,优化的前提是代码能正常工作。过早地进行优化可能会
今天总结3个提升Python运行速度的方法,只从代码本身考虑,提升运行速度并不会从编写C 扩展的代码、基于JIT的编译器技术考虑。
关于代码执行效率的第一个方法是减少频繁的方法访问,尤其是在多层循环内层、且循环次数较多的操作,差距尤为明显。
#真是模块内全局变量
importmath
defcompute_sqrt(nums):
result=[]
forninnums:#假如nums长度很大
#1.math.sqrt会被频繁访问
#2....
对于执行很耗时的程序来说,由于PyQt需要等待程序执行完毕才能进行下一步,这个过程表现在界面上就是卡顿,而如果需要执行这个耗时程序时不断的刷新界面。那么就可以使用QApplication.processEvents(),那么就可以一边执行耗时程序,一边刷新界面的功能,给人的感觉就是程序运行很流畅,因此QApplicationEvents()的使用方法就是,在主函数执行耗时操作的地方,加入QApplication.processEvents()
在大家的记忆中python是一门非常不错的语言,具有很多的优势,但python同样具有缺点,那就是运行效率低,那么为什么python运行效率低呢?原因在这里。1. python是动态语言动态语言是一类在运行时可以改变其结构的语言,如新的函数、对象、代码可以被引入,已有的函数可以被删除或其他结构上的变化等,该类语言更具有活性,但是不可避免的因为运行时的不确定性也影响运行效率。2. python是解释...
大家好,我是小寒。
一提到 python,大家的第一印象就是 python 语法简单,有丰富的库,它在机器学习和大数据中广泛使用。
同样,python 速度慢 也给大家留下了深刻印象。
不过,我们可以使用一些技巧来克服这个问题。
在本文中,我将分享一些 Python 技巧,使用这些技巧可以让我们的 Python 代码运行得比平时更快。
一、正确的算法和数据结构
「选择正确的数据结构,对代码的效率提升是显而易见的。」
python 中内置了 「list、tuple、set、dictionary」 等多种数据结