河南网站优化,天津网站建设举措,软文广告投放平台,股份有限公司1.1。Numba的约5分钟指南 Numba是Python的即时编译器#xff0c;它最适用于使用NumPy数组和函数以及循环的代码。使用Numba的最常用方法是通过其装饰器集合#xff0c;可以应用于您的函数来指示Numba编译它们。当调用Numba修饰函数时#xff0c;它被编译为机器代码“及时”执…1.1。Numba的约5分钟指南 Numba是Python的即时编译器它最适用于使用NumPy数组和函数以及循环的代码。使用Numba的最常用方法是通过其装饰器集合可以应用于您的函数来指示Numba编译它们。当调用Numba修饰函数时它被编译为机器代码“及时”执行并且您的全部或部分代码随后可以以本机机器代码速度运行开箱即用的Numba使用以下方法操作系统Windows(32位和64位)OSX和Linux(32位和64位) 架构x86x86_64ppc64le。在armv7larmv8l(aarch64)上进行实验。 GPUNvidia 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 npx np.arange(100).reshape(10, 10)jit(nopythonTrue) # 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 broadcastingprint(go_fast(x)) 对于看起来像这样的代码如果有的话它将无法正常工作from numba import jit import pandas as pdx {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 doesnt know about pd.DataFrame df 1 # Numba doesnt 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上面的例子中 nopythonTrue在jit装饰器中设置这是指示Numba在nopython模式下操作。nopython编译模式的行为本质上是编译装饰函数以便它完全运行而不需要Python解释器的参与。这是使用Numba jit装饰器的推荐和最佳实践方式因为它可以带来最佳性能。如果编译nopython模式失败Numba可以编译使用 如果没有设置这是装饰器的 后退模式(如上例所示)。在这种模式下Numba将识别它可以编译的循环并将它们编译成在机器代码中运行的函数并且它将运行解释器中的其余代码。为获得最佳性能请避免使用此模式objectmodejitnopythonTrueuse_pandas1.1.4。如何衡量Numba的表现 首先回想一下Numba必须为执行函数的机器代码版本之前给出的参数类型编译函数这需要时间。但是一旦编译完成Numba会为所呈现的特定类型的参数缓存函数的机器代码版本。如果再次使用相同的类型调用它它可以重用缓存的版本而不必再次编译。测量性能时一个非常常见的错误是不考虑上述行为并使用一个简单的计时器来计算一次该计时器包括在执行时编译函数所花费的时间。例如from numba import jit import numpy as np import timex np.arange(100).reshape(10, 10)jit(nopythonTrue) 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 traceDO 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.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的:import timedef num():arr []for i in range(10000000):arr.append(i)stime time.time() num() etime time.time() - stimeprint(arr)print(用时:{}秒.format(etime)) 示例输出时间:用时:1.4500024318695068秒示例2使用numba jitimport time from numba import jitjit def num():arr []for i in range(10000000):arr.append(i)stime time.time() num() etime time.time() - stimeprint(arr)print(用时:{}秒.format(etime)) 示例输出:用时:0.5530002117156982秒结论上述两个示例代码一个使用了numba另一个没有使用numba可以看出使用numba jit装饰后时间明显快了很多倍。这只是一个简单示例对于复杂计算提高速度更明显。