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装饰后执行的结果更佳。
加载全部内容