亲宝软件园·资讯

展开

Python numba代码提速

三爷带你飞 人气:0

简介: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装饰后执行的结果更佳。

加载全部内容

相关教程
猜你喜欢
用户评论