python numba教程,numba 安装

  python numba教程,numba 安装

  本文介绍了一个新的Python库——Numba,它在计算性能方面更加友好。

  1. Numba是什么?

  Numba是一个库,它可以在运行时将Python代码编译成本地机器指令,而无需对普通Python代码进行重大修改(稍后解释)。翻译/魔术是使用LLVM编译器完成的,它是由一个相当活跃的开源社区开发的。

  Numba最初是由Continuum Analytics内部开发的。这家公司还开发了著名的Anaconda,但现在它是开源的。核心应用领域是重数学(精数学?重数学?)和面向数组(array-oriented),在原生Python中相当慢。想象一下用Python写一个模块。你必须逐个元素地循环遍历一个非常大的数组来执行一些计算,但是你不能用向量运算重写它。这是一个非常糟糕的主意,不是吗?所以“通常”这个类库函数是用C/C或者Fortran写的。编译后作为Python中的外部库使用。像Numba这样的函数也可以用普通的Python模块编写,运行速度的差距在逐渐缩小。

  2.怎么才能get到Numba呢?

  安装Numba的推荐方法是使用conda包管理。

  康达安装编号

  也可以用pip安装Numba,但是最新版本才发布一天。不过,只要你会用conda,我都会推荐,因为它可以帮你安装CUDA工具包,比如。也许你想让你的Python代码GPU准备好(当然这也是可以的!)。

  3.如何使用Numba呢?

  使用起来没有太多要求。基本上,你编写自己的“普通”Python函数,然后在函数定义中添加一个decoration(如果你对decorators不是很熟悉,可以看看这个或者那个)。您可以使用不同类型的装饰器,但是@jit可能是首选之一。可以使用其他装饰器,例如,创建numpy通用函数@vectorize或编写要在CUDA GPU上执行的代码@cuda。这些装饰暂时不在本文介绍。现在,让我们看看基本步骤。他们提供的代码示例是2d数组的求和函数。代码如下:

  from numba import JIT from numpy import arange # JIT decorator告诉Numba编译这个函数。# Numba将在调用函数时推断参数类型。@jitdef sum2d(arr): M,N=arr . shape result=0.0 for I in range(M):for j in range(N):result=arr[I,j] returnresulta=arange (9)。shape (3,3) print (sum2d (a))可以看到,Numba装饰器被添加到了函数定义中。但是,这里有个有趣的注意:你只能使用Numpy和标准库中的函数来加速Numba,你甚至不需要开启它们所有的功能。他们有一个相当好的文档(参考资料)列出了所有支持的内容。这里是支持的Python函数,这里是支持的Numpy函数。现在支持的功能可能不太多,但是我想告诉你,这就够了!记住,Numba不是关于加快你的数据库查询或如何增强图像处理功能。他们的目标是加速面向数组的计算,我们可以通过使用他们库中提供的函数来解决这个问题。

  4.示例和速度比较

  熟练的Python用户绝不会用上面的代码实现sum函数,而是调用numpy.sum,我给你介绍另一个例子。为了更好的理解这个例子,一开始可能是一个小的背景故事。

  从我所学到的,我会认为自己是一个水文学家。我做的事情之一是模拟降雨径流过程。简单来说:通过时间序列数据,比如降雨量和气温,然后尝试创建一个模型来判断一条河流的水流量。这对于外行来说很复杂。但是,对我们来说,很简单。我们通常使用模块来迭代输入数组,对于每一个时间步,我们都会更新一些模块的内部状态(例如,模拟土壤湿度、下雪或在水中拦截树木)。在每个时间段结束时,计算水流量,水流量不仅取决于同一个时间步长内的降雨量,还取决于内部模型状态(或储存量)。在这种情况下,我们需要考虑前一时间步的状态和输出。那么你可能会看到这个问题:我们要一次又一次地计算整个过程,而Python本来就很慢,解决不了这个问题!这就是为什么大部分模块都是用Fortran或C/C实现的原因,如前所述:Python对于这种面向数组的计算来说比较慢。但是Numba允许我们在Python中做同样的事情,而没有太大的性能损失。我觉得至少对于模型的理解和开发可能是方便的。

  好吧,现在让我们看看我们有什么。我们将使用一个最简单的模块,MB Fiering在1967年为教育目的开发的ABC模型,并将Python代码的速度与Numba优化的Python代码和Fortran实现的速度进行比较。请注意,这个模型不是我们在现实中使用的(顾名思义),但我认为举个例子可能是个好主意。

  模块A,B,C是三参数模块(A,B,C,习惯性命名)。它只接收降雨量作为输入,并且只有一个存储。土壤蒸发蒸腾损失的总量(参数B),另一部分通过土壤渗入地下水储存(参数A),最后一个参数C代表地下水总量,离开地面变成了河流。使用Numpy数组的Python代码可能如下所示:

  导入numpy为npdef abc_model_py(a,b,c,rain): #初始化每个时间步出流的流量数组=np.zeros((rain.size),dtype=np.float64) # placeholder,其中我们保存i in范围内的前一个和# current时间步State _ in=0 State _ out=0(rain . size):#更新存储State _ out=(1-c)* State _ in a* rain[I]#计算流量出流[i]=.

  @jitdef abc_model_numba(a,b,c,Rain):outflow=NP . zeros((Rain . size),dtype=NP . float 64)state _ in=0 state _ out=0 for I in range(Rain . size):state _ out=(1-c)* state _ in a * Rain[I]outflow[I]=(1-a-b)* Rain[I]c * state _ out state _ in=state _ out return outflow我用随机数作为输入运行这些模块,只是为了比较计算让我们来看看这些数字:

  py _ time=%time it-r5-n10-o ABC _ model _ py(0.2,0.6,0.1,rain)

  每个循环6.75秒11.6毫秒(平均标准.偏差.,共5次运行,每次10个循环)

  #测量Numba实现的执行时间

  numba _ time=%time it-r5-n10-o ABC _ model _ numba(0.2,0.6,0.1,rain)

  每循环30.6毫秒498秒(平均标准.偏差.共5次运行,每次10次循环)

  #测量Fortran实现的执行时间

  fortran _ time=%time it-r5-n10-o ABC _ model _ fortran(0.2,0.6,0.1,rain)

  每循环31.9毫秒757秒(平均标准.偏差.共5次运行,每次10个循环)

  #比较纯Python与Numba优化时间

  py_time.最佳

  /222.1521754580626

  #比较fastes numba和fortran运行的时间

  numba_time.最佳

  0.9627960721576471

  通过增加一个装饰器,我们的计算速度比纯Python代码快222倍,甚至比Fortran快很多。在计算能力决定未来的时代,Numba一定会被更多人接受。

  这就是我的介绍。我希望现在有人有动力去看看Numba图书馆。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: