美文网首页大数据 爬虫Python AI Sql
Python中的numba的基本应用!让你的Python快一万倍

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

作者: 919b0c54458f | 来源:发表于2018-07-11 15:51 被阅读1次

    可以看到几乎有 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):

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

    相关文章

      网友评论

        本文标题:Python中的numba的基本应用!让你的Python快一万倍

        本文链接:https://www.haomeiwen.com/subject/jdbhpftx.html