由于python有动态解释性语言的特性,跑起代码来相比java、c++要慢很多,尤其在做科学计算的时候,十亿百亿级别的运算,让python的这种劣势更加凸显。

  因此就出现了解决python慢的一大利器numba,可以让python的运行速度提升上百倍甚至更多!

  numpy是为面向numpy数组的计算任务而设计的。

  Numba把NumPy数组类型生成高效的编译代码,用于在GPU或多核CPU上执行。

  在做大量科学计算时和使用for循环数据较多时,尽量使用numba。

一:什么是numba

  numba是一款可以将python函数编译为机器代码的JIT编译器,经过numba编译的python代码(仅限数组运算),其运行速度可以接近C或FORTRAN语言。



  numba的作用是给python换一种编译器。让代码直接转成机器码运行。

二:如何使用numba

  使用numba非常简单,只需要将numba装饰器应用到python函数中,无需改动原本的python代码,numba会自动完成剩余的工作。那么怎么使用呢,下面有一个例子。

1.计算numpy数组各个数值的双曲正切值。



(1)导入numpy、numba及其编译器

  1. import numpy as np
  2. import numba
  3. from numba import jit

(2)传入numba装饰器jit,编写函数

  1. # nopython = True 选项要求完全编译该函数(以便完全删除Python解释器调用),否则会引发异常
  2. @jit(nopython=True) # jit,numba装饰器中的一种
  3. def go_fast2(a): # 首次调用时,函数被编译为机器代码
  4. trace = 0
  5. # 假设输入变量是numpy数组
  6. for i in range(a.shape[0]): # Numba 擅长处理循环
  7. trace += np.tanh(a[i, i]) # numba喜欢numpy函数
  8. return a + trace # numba喜欢numpy广播

(3)给函数传递实参

  1. # 因为函数要求传入的参数是nunpy数组
  2. x = np.arange(100).reshape(10, 10)
  3. # 执行函数
  4. go_fast(x)

(4)经numba加速的函数执行时间

  1. % timeit go_fast(x)

(5)结果输出

  1. 3.63 µs ± 156 ns #加速后
  2. 136 µs ± 1.09 µs #不加速

快了40倍。

2.nunba对for循环的加速

(1)代码

  1. # 普通函数
  2. def go_fast1(): # 首次调用时,函数被编译为机器代码
  3. x = 0
  4. for i in np.arange(5000):
  5. x += i
  6. return x
  7. # nopython = True选项要求完全编译该函数(以便完全删除Python解释器调用),否则会引发异常
  8. @jit(nopython=True) # jit,numba装饰器中的一种
  9. def go_fast2(): # 首次调用时,函数被编译为机器代码
  10. x = 0
  11. for i in np.arange(5000):
  12. x += i
  13. return x

(2)结果输出

  1. 1.57 µs ± 53.8 ns #加速后
  2. 408 µs ± 9.73 µs #不加速

快了200倍。



  numba对python代码运行速度有巨大的提升,这极大的促进了大数据时代的python数据分析能力,但不会对numpy和for循环以外的python代码有很大帮助,对数据科学工作者来说,这真是一个好技术!

python numba讲解的更多相关文章

  1. Python 单例模式讲解

    Python 单例模式讲解 本节内容: classmethod用途 单例模式方法一 类__new__方法讲解 单例模式方法二 前言: 使用单例方法的好处:对于一个类,多次实例化会产生多个对象,若使用单 ...

  2. 用python语言讲解数据结构与算法

    写在前面的话:关于数据结构与算法讲解的书籍很多,但是用python语言去实现的不是很多,最近有幸看到一本这样的书籍,由Brad Miller and David Ranum编写的<Problem ...

  3. Python函数讲解

    Python函数

  4. 基于数据形式说明杜兰特的技术特点的分析(含Python实现讲解部分)

    ---恢复内容开始--- 注: 本博文系原创,转载请标明原处. 题外话:春节过后,回到学校无所事事,感觉整个人都生锈一般,没什么动力,姑且称为"春节后遗症".在科赛官网得到关于NB ...

  5. Python实例讲解 -- wxpython 基本的控件 (按钮)

    使用按钮工作 在wxPython 中有很多不同类型的按钮.这一节,我们将讨论文本按钮.位图按钮.开关按钮(toggle buttons )和通用(generic )按钮. 如何生成一个按钮? 在第一部 ...

  6. Python实例讲解 -- 获取本地时间日期(日期计算)

    1. 显示当前日期: print time.strftime('%Y-%m-%d %A %X %Z',time.localtime(time.time())) 或者 你也可以用: print list ...

  7. python基础讲解部分&纯小白需要扎实基础

    第一章知识点 一.Python简介 ​ python的创始人为吉多·范罗苏姆(Guido van Rossum),在中国人称龟叔 ​ Python崇尚优美.清晰.简单 应用领域: ​ (1)云计算,写 ...

  8. python通俗讲解闭包

    通俗理解闭包 先来看看什么是闭包吧 闭包是引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外.所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合 ...

  9. Python框架、库以及软件资源汇总

    转自:http://developer.51cto.com/art/201507/483510.htm 很多来自世界各地的程序员不求回报的写代码为别人造轮子.贡献代码.开发框架.开放源代码使得分散在世 ...

随机推荐

  1. Javase之集合体系之(1)集合顶层类Collection与其迭代器知识

    集合体系之集合顶层类Collection与其迭代器知识 集合的由来:Java是一门面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,就必须把多个对象进行存储,而要存 ...

  2. 查找发布地图的 REST URL并查询相关信息

    1.登录ArcGIS Server Manager 2.登录后,里面是以前自己发布的地图服务 3.点击自己发布的地图,然后按下功能选项,再点击箭头来找到URL 4.点击进去,分别能从红圈中找到相关的信 ...

  3. Discuz! 全局变量说明

    $_G 保存了 Discuz! 中所有的预处理数据 缓存能够很好的提高程序的性能,一些配置数据没必要每次都查询数据库,只要在修改了的时候更新下缓存即可. Discuz! 中所有的缓存保存在 $_G[c ...

  4. [20190522]DISABLE TABLE LOCK.txt

    [20190522]DISABLE TABLE LOCK.txt --//如果禁止table lock时,一些ddl操作会被禁止.但是我有点吃惊的是增加字段不受限制.--//通过测试说明问题. 1.环 ...

  5. Mysql双主加Keepalived+读写分离

    一.MySQL于keepalived简介** 前言: 在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要 ...

  6. Div转为Canvas简直不要太好玩~~~

    html2canvas库 今天发现了一个神奇的玩意,简直不要太好玩~~ 用canvas做动画是很难,但是div能比canvas简单不少,只是因为canvas中不能操作Dom元素 这款神器,可以直接将D ...

  7. 5. git-lab 项目操作

    项目操作 一.给成员授权项目权限 之前我们是给组增加成员.  当有的项目需要给组下面的成员授权不一样的时候. 我们需要在项目里面给成员授权权限 点击管理区域 点这个项目 看下图,我们可以看到  现在这 ...

  8. Tomcat相关目录及配置文件

    目录结构 [root@localhost tomcat]# tree -L 1.├── bin├── BUILDING.txt├── conf├── CONTRIBUTING.md├── lib├── ...

  9. zabbix使用钉钉告警

    1.钉钉创建群 2.[root@localhost ~]# vim /etc/zabbix/zabbix_server.conf # 配置文件中查找”Alert”查看告警脚本存放路径 [root@lo ...

  10. 剑指Offer-18.二叉树的镜像(C++/Java)

    题目: 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ ...