Python中的numba的基本应用!让你的Python快一万倍!
可以看到几乎有 200 倍的差距,这当然是无法忍受的。为此,我们可以用vectorize来定义出类似于Ufunc的函数:
虽然还是慢了 2 倍左右,但已经好很多了
然后有几点需要注意的地方:
* vectorize下的函数所接受的参数都是一个个的数而非整个数组。所以上述add_with_vec的参数yy其实是输入数组y中的元素,而不是y本身。更详细的说明可以参见官方文档)
* 可以看到当常数 c 是整数和是浮点数时、速度是不同的。个人猜测这是因为若常数 c 为整数,那么实际运算时需要将它转化为浮点数,从而导致速度变慢
* 上述代码中我们没有显式地定义函数的参数类型和返回类型,但我们可以预先定义。比如说,如果我确定常数 c 就是整数的话,我就可以这样写:
虽说在普通的 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原生的版本要稍快一些
这个栗子中的性能提升就是实打实的了。总之,使用parallel时不能一概而论,还是要做些实验需要指出的是,vectorize中的参数target一共有三种取值:cpu(默认)、parallel和cuda。关于选择哪个取值,官方文档上有很好的说明:
使用 jit(nogil=True) 实现高效并发(多线程)我们知道,Python 中由于有 GIL 的存在,所以多线程用起来非常不舒服。不过 numba 的 jit 里面有一项参数叫 nogil,想来聪明的观众老爷们都猜到了它是干什么的了……
下面就来看一个栗子:
numba 的应用实例 —— 卷积与池化如果只想看效果的话倒没什么关系,不过如果想知道我具体在干什么的话,可以参见这篇文章
首先是卷积操作:
那么程序的运行结果将会是:
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):
上一篇: C#使用GDI画圆的方法
下一篇: 手脚冰凉怎么调理 针灸五个穴位有效改善