开箱即用的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通常用作核心包,因此其依赖性保持在绝对最小值,但是,可以按如下方式安装额外的包以提供其他功能:
@H_404_34@进群:548377875 即可获取小编精心整理的全套资料哦!还有大量的pdf呢!
Numba在代码看起来像这样:
from numba import jitimport numpy as npx = np.arange(100).reshape(10,10)@jit(nopython=True) # Set "nopython" mode for best performancedef 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 broadcastingprint(go_fast(x))
对于看起来像这样的代码,如果有的话,它将无法正常工作:
from numba import jitimport pandas as pdx = {'a': [1,2,3],'b': [20,30,40]}@jitdef 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 jitimport numpy as npimport timex = 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 CACHEstart = time.time()go_fast(x)end = time.time()print("Elapsed (after compilation) = %s" % (end - start))
这,例如打印:
Elapsed (with compilation) = 0.33030009269714355Elapsed (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广义 ufunc s。 文件在这里 。 @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的:
import timedef 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 timefrom numba import jit@jitdef 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倍!你信吗?全部内容,希望文章能够帮你解决Python的运行速度慢!这点是公认的,加上这 *** 作快N倍!你信吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)