热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python:numba加速python的forloop

一、背景写了个算法需要多次计算两个字符串的编辑距离。这部分耗时比较多,想要进行优化。编辑距离代码见最后的附录。编辑距离本质上是双层forloop,而且
一、背景

写了个算法 需要多次计算两个字符串的编辑距离。这部分耗时比较多,想要进行优化。编辑距离代码见最后的附录。编辑距离本质上是双层for loop,而且是有依赖关系的for loop,因此无法并行。然后发现 numba ,介绍如下:
Numba is a just-in-time compiler for Python that works best on code that uses NumPy arrays and functions, and loops. The most common way to use Numba is through its collection of decorators that can be applied to your functions to instruct Numba to compile them. When a call is made to a Numba decorated function it is compiled to machine code “just-in-time” for execution and all or part of your code can subsequently run at native machine code speed!

本文主要介绍 nopython模式和 parallel模式

二、用法及其说明

2.1 @numba.njit()

用法非常简单,在函数上面使用装饰器

import numba@numba.jit(nopython=True) # 等价于 @numba.njit()
def editing_distance(word1: str, word2: str):''''''pass

nopython=True 意味着numba对装饰器 装饰的函数进行编译成机器码,完全不使用python 解释器。 注意

  1. 使用nopython=True 意味着着最佳的性能
  2. 如果nopython=True 失败,可以切换另外一个模式object 。这个模式会把可以把可编译为机器码的for loop 编译,无法成功编译的则使用python 解释器运行。这个加速效果就会比较差,建议如果发现nopython=True 的跑不通,就尽量去改变代码,让代码变得更贴近pure python,进而让代码跑通。
  3. 使用numba加速的函数,第一次被调用的时候会进行初次编译,这个时间会比较久。计算耗时的时候不应该被记入。第一次之后的执行都会感受到numba的加速
  4. numba 不会对所有的for loop都有明显的加速效果。具体的对于什么for loop有比较好的加速效果需要看代码。一般来说对于 pure python的数据结构和numpy 都会有比较好的加速效果

2.2 @numba.njit(parallel=True)

对并行的代码进行加速。
level 1 : 原始

def ident_parallel(x):return np.cos(x) ** 2 + np.sin(x) ** 2

level 2 : @numba.njit() 把python编译成机器码,加速 for loop

@numba.njit()
def ident_parallel(x):return np.cos(x) ** 2 + np.sin(x) ** 2

level 3 : @numba.njit(parallel=True) 把python编译成机器码加速for loop ,且同时利用并行进行优化

@numba.njit(parallel=True)
def ident_parallel(x):return np.cos(x) ** 2 + np.sin(x) ** 2

测试函数如下

if __name__=='__main__':a = np.zeros((20000, 20000))a_time = time.time()ident_parallel(a)b_time = time.time()print(f' consuming time is {b_time-a_time}')

耗时统计如下

level 14.3 s
level 20.9 s
level 30.29 s

可以依次看到 njit 的速度提升以及 njit+parallel 的速度提升

三、numba为什么快

https://numba.readthedocs.io/en/stable/user/5minguide.html#how-does-numba-work

Numba reads the Python bytecode for a decorated function and combines this with information about the types of the input arguments to the function. It analyzes and optimizes your code, and finally uses the LLVM compiler library to generate a machine code version of your function, tailored to your CPU capabilities. This compiled version is then used every time your function is called.

提前获取Python的输入参数类型,把Python的字节码转化成机器码,转化的过程有针对性的优化。每次使用这个函数的时候 直接使用的是机器码,而无需重新编译

附录

编辑距离

def editing_distance(word1: str, word2: str):'''两个字符串的编辑距离. '''if len(word1)==0:return len(word2)if len(word2)==0:return len(word1)size1 = len(word1)size2 = len(word2)last = 0tmp = list(range(size2 + 1))value = Nonefor i in range(size1):tmp[0] = i + 1last = ifor j in range(size2):if word1[i] == word2[j]:value = lastelse:value = 1 + min(last, tmp[j], tmp[j + 1])last = tmp[j+1]tmp[j+1] = valuereturn value


推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
author-avatar
天边的云YEAH_988
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有