由于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及其编译器

import numpy as np
import numba
from numba import jit

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

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

(3)给函数传递实参

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

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

% timeit go_fast(x)

(5)结果输出

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

快了40倍。

2.nunba对for循环的加速

(1)代码

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

(2)结果输出

1.57 µs ± 53.8 ns #加速后
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. Qt开源编辑器qsciscintilla的一些用法

    首先放一张自己做的软件中的编辑器的效果图 中间红色的框就是放在Qt的tabwidget控件中的qsciscintilla编辑器 先从官网下载qsciscintilla源码,在qtcreater中编译, ...

  2. 记录C#-WPF打开/关闭>>事件执行顺序

    打开执行顺序                                          关闭执行顺序

  3. 记录Flex布局的属性

    容器属性 flex-dirextion(主轴的方向):>>row(水平) | row-reverse(水平取反) | column(垂直) | column-reverse(垂直取反) f ...

  4. [20190531]ORA-600 kokasgi1故障模拟与恢复.txt

    [20190531]ORA-600 kokasgi1故障模拟与恢复.txt --//昨天看链接:http://www.xifenfei.com/2019/05/ora-600-kokasgi1-rec ...

  5. C++踩坑——用memset对vector进行初始化

    在一段程序中,使用memset对vector进行了初始化,然后得到了错误的结果.找这个bug花费了很长时间. vector中有其自身的结构,不能单纯的按字节进行初始化.使用memset对vector进 ...

  6. 1.Java基础_Java核心机制简介

    Java的两种核心机制 Java虚拟机机制 Java垃圾回收机制 解释名词 J2SDK&JRE: J2SDK=JDK=Software Development Kit(软件开发包) JRE=J ...

  7. scanf函数和cin的区别、类的数组、C++排序函数

    给定n个字符串,将这n个字符串按照字典序进行排列,此处用排列函数是C++的库函数sort,产生如下两个疑问,望大佬解答 #include <iostream> #include <a ...

  8. 忘记IBM服务器的登录IP

    问题描述: 一台服务器安装了winserver2003系统,经过漫长的加电启动,能进入到win2003的登录界面,提示ctrl+alt+del登录界面,但是发现键盘失灵了,无法键入ctrl+alt+d ...

  9. lua 5 流程控制 if

    条件判断中,0 表示 true,只有 nil 才是 false if(0) then -- 可以没有括号 print("0 为 true") elseif 1 then print ...

  10. 线程休眠sleep

    一.sleep的作用 sleep() 定义在Thread.java中.sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”.sleep()会指定休眠时间,线程休 ...