欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-08-22 22:35:38
可以看到几乎有 200 倍的差距,这当然是无法忍受的。为此,我们可以用vectorize来定义出类似于Ufunc的函数: 虽然还是慢了 2 倍左右,但已经好很多了 然后有几点需要注意的地方: * vectorize下的函数所接受的参数都是一个个的数而非整个数组。所以上述add_with_vec的参数 ......
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快一万倍!