首页 > 编程知识 正文

python怎么更新版本,linux如何查看cuda版本

时间:2023-05-03 17:11:58 阅读:9717 作者:4274

1.1。 Numba的约5分钟指南Numba是Python的即时编译器,非常适合使用NumPy数组、函数和循环的代码。 使用Numba的最常见方法是使用一组装饰,可以指示Numba应用于函数进行编译。 调用Numba限定函数时,它将编译为机器码并“及时”运行,允许全部或部分代码以本机机器码速度运行。

开箱后的Numba使用以下方法:

操作系统: windows(32位和64位)、OSX和Linux (32位和64位)、x86_64、ppc64le。 用armv7l、armv8L(aarch64 )进行实验。 GPU:Nvidia CUDA。 AMD ROC的实验。 CPython的编号1.1.1最新1.1.1。 我怎么得到那个? Numba可以作为蟒蛇Python的免费缓冲包发布:

$ conda install numba Numba还有pip。

$ pip install Numba Numba也可以从源代码进行编译。 虽然不建议首次使用numba用户。

Numba通常用作核心软件包,因此依赖关系保持绝对的最小值,但可以按如下方式安装其他软件包以提供其他功能:

支持sipy-numpy.linalg的编译功能。 colorama -支持回溯/错误消息的颜色编码。 使用pyyaml-YAML配置文件启用Numba配置。 允许使用ICC_rt-IntelSVML (高性能短矢量数学库,仅限x86_64 )。 安装说明位于性能提示中。 1.1.2。 Numba会为我的代码工作吗? 根据代码是什么样的,如果代码很重视数字,做了很多数学运算,经常使用NumPy或有很多循环,Numba通常是一个很好的选择。 这些示例应用最基本的numba JIT装饰器。 @jit试图加速一些函数,以指示哪些有效,哪些无效。

Numba在代码中看起来像这样:

fromnumbaimportjitimportnumpyasnp

x=NP.arange(100 ).reshape (10,10 ) )。

@JIT(nopython=true ) set ' no python ' modeforbestperformancedefgo _ fast ) a ) : # functioniscompiledtomachinecodewhencalledthefirsttimetrace=0foriinrange (a.shape [0] ) : # numbalikesloopstrace=nn

对于看起来像这样的代码,print(go_fast ) x ) (如果有)将无法正常工作。

fromnumbaimportjitimportpandasaspd

x={ ' a ' : [ 1,2,3 ],' b ' : [ 20,30,40 ] }

@JITdefuse_pandas(a ) : # functionwillnotbenefitfromnumbajitdf=PD.data frame.from _ dict (a ) ) ) ) ) ) numba doesn ' tknowaboutpd.dataframedf=1# numba doesn ' tunderstandwhatthisisreturndf.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识别可编译的循环,将其编译为在机器码中执行的函数,然后执行解释器中的其馀代码。 为了获得最佳性能,请不要使用此模式object mode @ jitnopython=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- 生成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 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装饰后,时间明显快了很多倍。

这只是一个简单示例;对于复杂计算提高速度更明显。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。