通过numba模块给Python代码提速的方法详解
作者:三爷带你飞 发布时间:2022-02-02 09:15:19
简介: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装饰后执行的结果更佳。
来源:https://blog.csdn.net/hzblucky1314/article/details/122429569
猜你喜欢
- 本文实例讲述了Flask教程之重定向与错误处理。分享给大家供大家参考,具体如下:Flask类有一个redirect()方法. 当我们调用它时
- 本文实例讲述了Python设计模式之模板方法模式。分享给大家供大家参考,具体如下:模板方法模式(Template Method Patter
- 除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息。比如,在一个网络应用中,可能希望在日志中记录
- 我们能否使用一些自动化工具代替人来完成数据分析的过程呢,现有一些成熟的 AutoEDA 工具可以一定程度上完成上述过程。本文中,我将盘点常见
- SQL Server具有强大的复制功能,除了将数据和数据库对象从一个数据库复制并准确分发的另一个数据库中,还要实行数据库之间的同步。SQL
- 不管是一名学生,亦或是一名员工,我们都需要时刻注意学校或公司网站的通知,尽量做到即时获取最新消息。大部分博客或数据资源网站都会有自己的RSS
- 一、绘制折线图使用plot()绘制折线图常用的参数:x:表示x轴的数据y:表示y轴的数据fmt:表示快速设置条样式的格式字符串。label:
- 今天研究了点Flex技术,做了一个小的Demo,在测试时发现经常报错,网上一查发现是浏览器Flash Player版本较低造成(需要10及其
- 一、数据降维机器学习中的维度就是特征的数量,降维即减少特征数量。降维方式有:特征选择、主成分分析。1.特征选择当出现以下情况时,可选择该方式
- 简介卷积神经网络(Convolutional Neural Network, CNN)是深度学习技术中极具代表的网络结构之一,在图像处理领域
- 如图:会出现带有红色波浪线,但是确实有random_walk文件解决方法:在当前文件下,右键找到mark Directory as然后选择s
- Python 提供了 日期和时间模块用来处理日期和时间,还可以用于格式化日期和时间等常见功能。时间间隔是以秒为单位的浮点小数。每个时间戳都以
- 简介:PyInstaller可以将Python源代码发布成Win/MacOS等系统中的可执行文件。对开发者而言隐藏了源码实现,保护了知识产权
- 具体内容如下:1 os.system例如 ipython中运行如下命令,返回运行状态statusos.system('cat /et
- 一、什么是星号变量最初,星号变量是用在函数的参数传递上的,在下面的实例中,单个星号代表这个位置接收任意多个非关键字参数,在函数的*b位置上将
- import osimport sysimport MySQLdbdef getStatus(conn):  
- Linux Journal 发表了一篇优化 Oracle 数据库的文章,感觉十分的有用。简要介绍其摘要和大家共同分享 Linux 在企业级数
- 笔者小白在收集印刷体汉字的深度学习训练集的时候,一开始就遇到的了一个十分棘手的问题,就是如何获取神经网络的训练集数据。通过上网搜素,笔者没有
- 三元运算又称三目运算,是对简单的条件语句的简写简单条件语句:if 条件成立: val = 1else: val =
- 在开发web的时候,如果是以前已存在的项目,项目下载下来后,为了使用测试库的数据,会直接将整个测试库(如sqlite3)拿到本机来。这种情况