Python中的numba的基本应用!让你的Python快一万…

2018-07-12 07:43:38来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

Python中的numba的基本应用!让你的Python快一万倍!

 

Python中的numba的基本应用!让你的Python快一万倍!

 

Python中的numba的基本应用!让你的Python快一万倍!

 

可以看到几乎有 200 倍的差距,这当然是无法忍受的。为此,我们可以用vectorize来定义出类似于Ufunc的函数:

Python中的numba的基本应用!让你的Python快一万倍!

 

虽然还是慢了 2 倍左右,但已经好很多了

然后有几点需要注意的地方:

* vectorize下的函数所接受的参数都是一个个的数而非整个数组。所以上述add_with_vec的参数yy其实是输入数组y中的元素,而不是y本身。更详细的说明可以参见官方文档)

* 可以看到当常数 c 是整数和是浮点数时、速度是不同的。个人猜测这是因为若常数 c 为整数,那么实际运算时需要将它转化为浮点数,从而导致速度变慢

* 上述代码中我们没有显式地定义函数的参数类型和返回类型,但我们可以预先定义。比如说,如果我确定常数 c 就是整数的话,我就可以这样写:

Python中的numba的基本应用!让你的Python快一万倍!

 

虽说在普通的 Python3.6.1 下、运行结果将如下:

73.5 μs ± 4.22 μs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

21.2 μs ± 734 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

似乎还变慢了;不过如果使用 Intel Distribution for Python 的话,会发现parallel版本甚至会比numpy原生的版本要稍快一些

Python中的numba的基本应用!让你的Python快一万倍!

 

这个栗子中的性能提升就是实打实的了。总之,使用parallel时不能一概而论,还是要做些实验需要指出的是,vectorize中的参数target一共有三种取值:cpu(默认)、parallel和cuda。关于选择哪个取值,官方文档上有很好的说明:

Python中的numba的基本应用!让你的Python快一万倍!

 

使用 jit(nogil=True) 实现高效并发(多线程)我们知道,Python 中由于有 GIL 的存在,所以多线程用起来非常不舒服。不过 numba 的 jit 里面有一项参数叫 nogil,想来聪明的观众老爷们都猜到了它是干什么的了……

下面就来看一个栗子:

Python中的numba的基本应用!让你的Python快一万倍!

 

Python中的numba的基本应用!让你的Python快一万倍!

 

numba 的应用实例 —— 卷积与池化如果只想看效果的话倒没什么关系,不过如果想知道我具体在干什么的话,可以参见这篇文章

首先是卷积操作:

Python中的numba的基本应用!让你的Python快一万倍!

 

Python中的numba的基本应用!让你的Python快一万倍!

 

那么程序的运行结果将会是:

281 ms ± 12.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

66.2 ms ± 2.32 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

可以看到这又快了 3 倍左右

接下来是池化操作(我们选用的是 MaxPool):

Python中的numba的基本应用!让你的Python快一万倍!

 

Python中的numba的基本应用!让你的Python快一万倍!

 

Python中的numba的基本应用!让你的Python快一万倍!

进群:125240963    即可获取数十套PDF哦!

Python中的numba的基本应用!让你的Python快一万倍!

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:(day 1)创建项目--1

下一篇:Python学习:15.Python面向对象(二、继承的各种情况)