若是您有任何疑问,请在下面发表评论。
大数据部落 -中国专业的第三方数据服务提供商,提供定制化的一站式数据挖掘和统计分析咨询服务
统计分析和数据挖掘咨询服务:y0.cn/teradat(咨询服务请联系官网客服)
【服务场景】
科研项目; 公司项目外包;线上线下一对一培训;数据爬虫采集;学术研究;报告撰写;市场调查。
【大数据部落】提供定制化的一站式数据挖掘和统计分析咨询
欢迎选修咱们的R语言数据分析挖掘必知必会课程!
摘要:在计算能力为王的时代,具备高性能计算的库正在被普遍你们应用于处理大数据。例如:Numpy,本文介绍了一个新的Python库——Numba, 在计算性能方面,它比Numpy表现的更好。数据库
最近我在观看一些SciPy2017会议的视频,偶然发现关于Numba的来历--讲述了那些C++的高手们由于对Gil Forsyth和Lorena Barba失去信心而编写的一个库。虽然本人以为这个作法有些不妥,但我真的很喜欢他们所分享的知识。由于我发现本身正在受益于这个库,而且从Python代码中得到了使人难以置信的表现,因此我以为应该要写一些关于Numba库的介绍性文章,也可能会在未来添加一系列小的更多相似教程的文章。数组
1.那么到底什么是Numba?微信
Numba是一个库,能够在运行时将Python代码编译为本地机器指令,而不会强制大幅度的改变普通的Python代码(稍后再作说明)。翻译/魔术是使用LLVM编译器完成的,该编译器是至关活跃的开源社区开发的。app
Numba最初是由Continuum Analytics内部开发,此公司也开发了著名的Anaconda,但如今它是开源的。核心应用领域是math-heavy(密集数学?重型数学?)和array-oriented(面向数组)的功能,它们在本地Python中至关缓慢。想象一下,在Python中编写一个模块,必须一个元素接着一个元素的循环遍历一个很是大的数组来执行一些计算,而不能使用向量操做来重写。这是很很差的主意,是吧?因此“一般”这类库函数是用C / C ++或Fortran编写的,编译后,在Python中做为外部库使用。Numba这类函数也能够写在普通的Python模块中,并且运行速度的差异正在逐渐缩小。函数
2.怎么才能get到Numba呢?工具
安装Numba的推荐方法是使用conda包管理post
你也能够用pip来安装Numba,可是最新版本的发布才一天之久。可是,只要你可以使用conda,我会推荐使用它,由于它可以为你安装例如CUDA工具包,也许你想让你的Python代码GPU就绪(固然,这也是有可能的!)。性能
3.如何使用Numba呢?学习
使用它的要求很少。基本上,你写一个本身的“普通”的Python函数,而后给函数定义添加一个装饰。你可使用不一样类型的装饰器,但@jit多是刚开始的选择之一。其余装饰器可用于例如建立numpy通用功能@vectorize或编写将在CUDA GPU上执行的代码@cuda。我不会在这篇文章中介绍这些装饰。如今,让咱们来看看基本的步骤。他们提供的代码示例是2d数组的求和函数,如下是代码:大数据
正如你所看到的,Numba装饰器被添加到函数定义中,而且voilá这个函数将运行得很快。可是,这里带来了颇有趣的注意事项:你只能使用Numpy和标准库里的函数来加快Numba速度,甚至不须要开了他们全部的特性。见here是所支持Python的功能和here是所支持的Numpy功能。如今支持的功能可能还不太多,但我想告诉你,这就够了!请记住,Numba不是要加快你的数据库查询或如何强化图像处理功能。他们的目标是加快面向数组的计算,咱们可使用它们库中提供的函数来解决。
4.示例和速度比较
熟练的Python用户永远不会使用上述代码实现sum功能,而是调用numpy.sum。相反,我将向你介绍另一个例子,为了更好地理解这个例子,也许刚开始是一个小的背景故事。
从我所学习的知识来看,我会认为本身是一个水文学家,我作的不少的一件事是模拟降雨径流过程。简单点来讲:经过时间序列数据,例如雨量和空气温度,而后尝试建立模型来判断一条河流的水流量有多少。这在外行看来是很是复杂。但,对于咱们来讲,很简单。咱们一般使用的模块迭代输入数组,而且对于每一个时间步长,咱们会更新一些模块内部的状态(例如,模拟土壤水分,积雪或拦截水中的树木)。在每一个时间段结束时,计算水流量,这不只取决于在同一时间步长下的雨,并且也取决于在内部模型状态(或储存)。在这种状况下,咱们就须要考虑之前时间步长的状态和输出。那么你可能会看到这个问题:咱们必须一段时间接一段时间的计算整个流程,而对于解决这种问题Python原本就是很慢的!这就是为何大多数模块都是在Fortran或C/C ++中实现的。如前所述:Python在对于这种面向数组的计算来讲是慢的。可是Numba容许咱们在Python中作一样的事情,并且没有太多的性能损失。我认为至少对于模型的理解和发展,这可能会很方便。
Okay,如今咱们来看看咱们get到了什么。咱们将使用最简单的模块之一,由MB Fiering在1967年出于教育目的开发的ABC模型,并将Python代码的速度与Numba优化后Python代码和Fortran实现进行比较。请注意这个模型不是咱们在现实中使用的(正如名称所示),可是我认为这多是一个不错的想法来举例。
A、B、C模块是一个三个参数模块(a,b,c,习惯性命名),它只接收下雨量为输入,只有一个存储。土壤水分蒸发蒸腾损失总量(参数b),另外一部分经过土壤渗透到地下水储存(参数a),最后一个参数c表明地下水总量,离开地下变成河流。Python中的代码,使用Numpy数组可能会像以下所示:
接下来咱们使用Numba来实现相同的功能。
我用随机数字做为输入来运行这些模块,这只是为了比较计算时间,并且也比较了针对fortran实现的时间(详见here)。咱们来看看数字:
经过添加一个装饰器,咱们的计算速度比纯Python代码快222倍,甚至比Fortran也快不少。在计算能力决定将来的时代,Numba必定会被更多人接受。
以上就是个人介绍,但愿有人如今有动力去看看Numba库。我想在未来我会编写一系列小的Numba文章/教程,并提供更多的技术信息,让更多的人使用Numba 库。而本文仅做为一个开始。
大数据部落 -中国专业的第三方数据服务提供商,提供定制化的一站式数据挖掘和统计分析咨询服务
统计分析和数据挖掘咨询服务:y0.cn/teradat(咨询服务请联系官网客服)
【服务场景】
科研项目; 公司项目外包;线上线下一对一培训;数据爬虫采集;学术研究;报告撰写;市场调查。
【大数据部落】提供定制化的一站式数据挖掘和统计分析咨询
欢迎选修咱们的R语言数据分析挖掘必知必会课程!