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

 更新时间:2022年01月13日 10:42:58   作者:三爷带你飞  
numba是Anaconda公司开发的针对Python的开源JIT编译器,用于提供Python版CPU和GPU编程,速度比原生Python快数十倍。本文将详细介绍一下numba是如何实现代码提速的,需要的可以参考一下

简介:numba是Anaconda公司开发的针对Python的开源JIT编译器,用于提供Python版CPU和GPU编程,速度比原生Python快数十倍。numba是第三方库,可以在运行时将Python代码编译为本地机器指令,而不会强制大幅度的改变普通的Python代码,使得在部分场景下执行Python的效率得到飞速的提升。

工作原理对比:

Python文件执行过程

1、.py文件通过解释器转化为虚拟机可以执行的字节码(.pyc);字节码在虚拟机上执行,得到结果。

2、字节码是一种只能运行在虚拟机上的文件,默认后缀.pyc,Python生成.pyc之后一般放在内存中继续使用,并不是每次都将.pyc文件保存到磁盘上。

而在JIT(Just-In-Time)技术中,JIT编译器将Python源代码.py直接编译成机器可以执行的机器语言(机器码),就可以直接在CPU等硬件上运行。这样,JIT就跳过了原来的虚拟机,执行速度几乎与用C语言编程速度无差别。

numba是Anaconda公司开发的针对Python的开源JIT编译器。谷歌开源的jax库也是属于jit编译器之一,该模块则主要应用于科学计算和机器学习方向。

安装:如网络限制,请绕道国内镜像豆瓣源,清华源等。pip安装第三方库全攻略:普通安装、安装whl后缀文件、使用国内镜像安装

pip install numba

使用方法:

from numba import jit
对函数进行装饰@jit(nopython=True)

注意事项:numba只符合部分场景,特殊场景无法使用。例如机器学习训练数据时,不能简单的进行装饰使用,否则会抛出异常。

源码:

from numba import jit
import datetime


def calc_sum1(loop):
    n = 0
    for i in range(loop):
        for j in range(loop):
            n += j
    return n


@jit(nopython=True)
def calc_sum2(loop):
    n = 0
    for i in range(loop):
        for j in range(loop):
            n += j
    return n


@jit(nopython=True)
def calc_sum2(loop):
    n = 0
    for i in range(loop):
        for j in range(loop):
            n += j
    return n


if __name__ == '__main__':
    print(datetime.datetime.now())
    r1 = calc_sum1(10000)
    print(r1)
    print(datetime.datetime.now())

    print("*" * 30)
    print(datetime.datetime.now())
    r2 = calc_sum2(10000)
    print(r2)
    print(datetime.datetime.now())

结果对比:原始代码执行需要花费5秒左右,而使用numba装饰后仅需300毫秒左右,提升10倍有余。如果loop设置的参数更长,numba装饰后执行的结果更佳。

到此这篇关于通过numba模块给Python代码提速的方法详解的文章就介绍到这了,更多相关Python numba代码提速内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python发送网络请求(requests)

    Python发送网络请求(requests)

    这篇文章主要介绍了Python发送网络请求(requests),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • python 批量修改/替换数据的实例

    python 批量修改/替换数据的实例

    今天小编就为大家分享一篇python 批量修改/替换数据的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python类中的魔法方法之 __slots__原理解析

    Python类中的魔法方法之 __slots__原理解析

    这篇文章主要介绍了Python类中的魔法方法之 __slots__详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • python实现对服务器脚本敏感信息的加密解密功能

    python实现对服务器脚本敏感信息的加密解密功能

    这篇文章主要介绍了python实现对服务器脚本敏感信息的加密解密功能,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • python爬取微博评论的实例讲解

    python爬取微博评论的实例讲解

    在本篇文章里小编给大家整理的是一篇关于python爬取微博评论的实例讲解,有兴趣的朋友们可以学习下。
    2021-01-01
  • 简述 Python 的类和对象

    简述 Python 的类和对象

    这篇文章主要介绍了Python 的类和对象的相关资料,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-08-08
  • Python的线程之线程同步

    Python的线程之线程同步

    这篇文章主要为大家介绍了Python线程同步,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • Python decorator拦截器代码实例解析

    Python decorator拦截器代码实例解析

    这篇文章主要介绍了Python decorator拦截器代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Flask接口签名sign原理与实例代码浅析

    Flask接口签名sign原理与实例代码浅析

    这篇文章主要介绍了Flask接口签名sign原理与实例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • django项目中使用云片网发送短信验证码的实现

    django项目中使用云片网发送短信验证码的实现

    这篇文章主要介绍了django项目中使用云片网发送短信验证码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论