通过numba模块给Python代码提速的方法详解
简介: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代码提速内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!