利用numba让python速度提升百倍

目录
  • 一、什么是numba?
  • 二、numba适合科学计算
  • 三、学习使用numba
  • 四、numba让python飞起来

前言;

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

办法永远比困难多,numba就是解决python慢的一大利器,可以让python的运行速度提升上百倍!

一、什么是numba?

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

python之所以慢,是因为它是靠CPython编译的,numba的作用是给python换一种编译器。

python、c、numba三种编译器速度对比:

使用numba非常简单,只需要将numba装饰器应用到python函数中,无需改动原本的python代码,numba会自动完成剩余的工作。

import numpy as np
import numba
from numba import jit

@jit(nopython=True) # jit,numba装饰器中的一种
def go_fast(a): # 首次调用时,函数被编译为机器代码
    trace = 0
    # 假设输入变量是numpy数组
    for i in range(a.shape[0]):   # Numba 擅长处理循环
        trace += np.tanh(a[i, i]) 
    return a + trace

以上代码是一个python函数,用以计算numpy数组各个数值的双曲正切值,我们使用了numba装饰器,它将这个python函数编译为等效的机器代码,可以大大减少运行时间。

二、numba适合科学计算

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

在面向数组的计算任务中,数据并行性对于像GPU这样的加速器是很自然的。Numba了解NumPy数组类型,并使用它们生成高效的编译代码,用于在GPU或多核CPU上执行。特殊装饰器还可以创建函数,像numpy函数那样在numpy数组上广播。

什么情况下使用numba呢?

  • 使用numpy数组做大量科学计算时
  • 使用for循环时

三、学习使用numba

第一步:导入numpy、numba及其编译器

import numpy as np
import numba 
from numba import jit

第二步:传入numba装饰器jit,编写函数

# 传入jit,numba装饰器中的一种
@jit(nopython=True) 
def go_fast(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广播

nopython = True选项要求完全编译该函数(以便完全删除Python解释器调用),否则会引发异常。这些异常通常表示函数中需要修改的位置,以实现优于Python的性能。强烈建议您始终使用nopython = True。

第三步:给函数传递实参

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

第四步:经numba加速的函数执行时间

% timeit go_fast(x)

输出:

3.63 µs ± 156 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

第五步:不经numba加速的函数执行时间

def go_fast(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广播

x = np.arange(100).reshape(10, 10) 
%timeit go_fast(x)

输出:

136 µs ± 1.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

结论:

在numba加速下,代码执行时间为3.63微秒/循环。不经过numba加速,代码执行时间为136微秒/循环,两者相比,前者快了40倍。

四、numba让python飞起来

前面已经对比了numba使用前后,python代码速度提升了40倍,但这还不是最快的。

这次,我们不使用numpy数组,仅用for循环,看看nunba对for循环到底有多钟爱!

# 不使用numba的情况
def t():
    x = 0
    for i in np.arange(5000):
        x += i
    return x
%timeit(t())

输出:

408 µs ± 9.73 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# 使用numba的情况
@jit(nopython=True) 
def t():
    x = 0
    for i in np.arange(5000):
        x += i
    return x
%timeit(t()) 

输出:

1.57 µs ± 53.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

使用numba前后分别是408微秒/循环、1.57微秒/循环,速度整整提升了200多倍!

结语:

numba对python代码运行速度有巨大的提升,这极大的促进了大数据时代的python数据分析能力,对数据科学工作者来说,这真是一个lucky tool !

当然numba不会对numpy和for循环以外的python代码有很大帮助,你不要指望numba可以帮你加快从数据库取数,这点它真的做不到哈。

到此这篇关于利用numba让python速度提升百倍的文章就介绍到这了,更多相关python速度提升numba内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于Numba提高python运行效率过程解析

    Numba是Python的即时编译器,在使用NumPy数组和函数以及循环的代码上效果最佳.使用Numba的最常见方法是通过其装饰器集合,这些装饰器可应用于您的函数以指示Numba对其进行编译.调用Numba装饰函数时,它会被"即时"编译为机器代码以执行,并且您的全部或部分代码随后可以本机机器速度运行! 安装numba(我在这里加了--default-timeout=10000,防止安装时出现timeout的错误) pip --default-timeout=10000 install

  • 通过numba模块给Python代码提速的方法详解

    简介:numba是Anaconda公司开发的针对Python的开源JIT编译器,用于提供Python版CPU和GPU编程,速度比原生Python快数十倍.numba是第三方库,可以在运行时将Python代码编译为本地机器指令,而不会强制大幅度的改变普通的Python代码,使得在部分场景下执行Python的效率得到飞速的提升. 工作原理对比: Python文件执行过程 1..py文件通过解释器转化为虚拟机可以执行的字节码(.pyc):字节码在虚拟机上执行,得到结果. 2.字节码是一种只能运行在虚拟

  • 使用numba对Python运算加速的方法

    有时候需要比较大的计算量,这个时候Python的效率就很让人捉急了,此时可以考虑使用numba 进行加速,效果提升明显~ (numba 安装貌似很是繁琐,建议安装Anaconda,里面自带安装好各种常用科学计算库) from numba import jit @jit def t(count=1000): total = 0 for i in range(int(count)): total += i return total 测试效果: (关于__wrapped__ 见我的博文: 浅谈解除装饰

  • 利用Numba与Cython结合提升python运行效率详解

    目录 Numba Numba 模式 什么是LLVM? Numba的优势: Numba的劣势: Cython Cython的优势: Cython的劣势: Numba 对 Cython Numba Numba是一个即时(JIT)编译器,它将Python代码转换为用于CPU和GPU的本地机器指令.代码可以在导入时.运行时或提前编译. 通过使用jit装饰器,使用Numba非常容易: 正如你所知道的,在Python中,所有代码块都被编译成字节码: 代码优化 为了优化Python代码,Numba从提供的函数

  • Python 提速器numba

    目录 1.为什么 python 这么慢 动态变量 解释性语言 2.numba 加速 python 的小例子 4.numba 使用 CUDA 加速 5.For 循环写法的影响 在循环前预先计算好所有的 vec Python python 真的太好用了,但是它真的好慢啊(哭死) ; C++ 很快,但是真的好难写啊,此生能不碰它就不碰它.老天啊,有没有什么两全其美的办法呢?俗话说的好:办法总是比困难多,大家都有这个问题,自然也就有大佬来试着解决这个问题,这就请出我们今天的主角: numba 不过在介绍

  • numba提升python运行速度的实例方法

    大家都知道Python运行速度很慢,但是轮子多,因此用户十分广泛,在各种领域上都能用到Python,但是最头疼的还是,解决运行速度问题,因此这里给大家介绍的是numba,是基本是等于再造语言.但是支持的numpy函数并不多.要让能jit的函数多起来才行.下面就详细介绍使用numba提升python运行速度方法. numba简介: 能够实现将python函数编译为机器代码,提高运行速度. 工作作用: 给python换一种编译器 使用numba: 1.导入numba及其编译器 import nump

  • 利用numba让python速度提升百倍

    目录 一.什么是numba? 二.numba适合科学计算 三.学习使用numba 四.numba让python飞起来 前言; python由于它动态解释性语言的特性,跑起代码来相比java.c++要慢很多,尤其在做科学计算的时候,十亿百亿级别的运算,让python的这种劣势更加凸显. 办法永远比困难多,numba就是解决python慢的一大利器,可以让python的运行速度提升上百倍! 一.什么是numba? numba是一款可以将python函数编译为机器代码的JIT编译器,经过numba编译

  • 只需要这一行代码就能让python计算速度提高十倍

    一.前言 Python语言近年来人气爆棚.它广泛应用于数据科学,人工智能,以及网络安全问题中,由于代码可读性较强,学习效率较高,吸引了许多非科班的同学进行学习.然而,使用Python一段时间以后,发现它在速度上完全没有优势可言,特别是计算密集型任务里,性能问题一直是Python的软肋.本文主要介绍了Python的JIT编译器Numba,能够在对代码侵入最少的情况下,极大加速计算核心函数的运行速度,适合数据分析业务相关的同学使用. 首先要回答这样一个问题:当运行同一个程序时,为什么Python会

  • 利用JuiceFS使MySQL 备份验证性能提升 10 倍

    目录 数据准备 使用默认参数 增大XtraBackup的内存缓冲区 增大XtraBackup读线程数 JuiceFS启用异步写 增大JuiceFS的磁盘缓存 增大数据库数据量 总结 前言: JuiceFS 非常适合用来做 MySQL 物理备份,具体使用参考官方文档.在测试时,备份验证的数据准备(xtrabackup --prepare)过程非常慢.我们借助 JuiceFS 提供的性能分析工具做了分析,快速发现性能瓶颈,通过不断调整 XtraBackup 的参数和 JuiceFS 的挂载参数,在一

  • 详解如何利用Cython为Python代码加速

    引言 通常,在 Python 中写循环(特别是多重循环)非常的慢,在文章 //www.jb51.net/article/133807.htm中,我们的元胞自动机的状态更新函数 update_state 使用了两重循环,所以我们尝试用 Cython 重构该方法. 代码 我们在同文件夹下新建一个 update.pyx 文件,写入如下内容 import numpy as np cimport numpy as np cimport cython DTYPE = np.float ctypedef np

  • 能让Python提速超40倍的神器Cython详解

    让Python提速超过40倍的神器:Cython 人工智能最火的语言,自然是被誉为迄今为止最容易使用的代码之一的Python.Python代码素来以直观.高可读性著称. 然而,易用的背后,是Python无法逾越的障碍:慢.尤其是C程序员,这群快枪手简直无法忍受Python的慢. 所以有人就想了各种方法去解决这个问题,本文就介绍其中的一种.如果你的代码是纯Python,或者你必须用一个大的for循环却无法放入矩阵因为数据必须按顺序处理,那么就可以使用Cython来加速Python. 1.什么是Cy

  • python 性能提升的几种方法

    关于python 性能提升的一些方案. 一.函数调用优化(空间跨度,避免访问内存) 程序的优化核心点在于尽量减少操作跨度,包括代码执行时间上的跨度以及内存中空间跨度. 1.大数据求和,使用sum a = range(100000) %timeit -n 10 sum(a) 10 loops, best of 3: 3.15 ms per loop %%timeit ...: s = 0 ...: for i in a: ...: s += i ...: 100 loops, best of 3:

  • MongoDB创建一个索引而性能提升1000倍示例代码

    MongoDB 创建索引的语法 1.为普通字段添加索引,并且为索引命名 db.集合名.createIndex( {"字段名": 1 },{"name":'idx_字段名'}) 说明: (1)索引命名规范:idx_<构成索引的字段名>.如果字段名字过长,可采用字段缩写. (2)字段值后面的 1 代表升序:如是 -1 代表 降序. 2.为内嵌字段添加索引 db.集合名.createIndex({"字段名.内嵌字段名":1},{"

随机推荐