Numba:加速python代码

这篇具有很好参考价值的文章主要介绍了Numba:加速python代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 通常我们加速python代码是考虑把.py文件编译成.c文件,然后把.c文件编译成.so或.pyd文件,可以参考另一章博文:

Cython为py程序加密&提高性能_cythonize_Rnan-prince的博客-CSDN博客

现在我们考虑一种不用将py文件编译成.c文件的方法:numba,其实原理差不多,只是用户不感知。

Numba简介

Numba是一款可以将python函数编译为机器代码的JIT编译器,经过Numba编译的python代码(仅限数组运算),其运行速度可以接近C或FORTRAN语言。普通python语言靠Cython编译的,但是Numba使用Jit编译器可以直接将一个函数转化为机器码。

User Manual — Numba 0.50.1 documentationhttp://numba.pydata.org/numba-doc/latest/user/index.htmlJIT的全称是 Just-in-time,在 numba 里面则特指 Just-in-time compilation(即时编译)。

编译方式有:

  • 动态编译(dynamic compilation):指的是“在运行时进行编译”;与之相对的是事前编译(ahead-of-time compilation,简称AOT),也叫静态编译(static compilation)。
  • JIT编译(just-in-time compilation)狭义来说是当某段代码即将第一次被执行时进行编译,因而叫“即时编译”。JIT编译是动态编译的一种特例。JIT编译一词后来被泛化,时常与动态编译等价;但要注意广义与狭义的JIT编译所指的区别。
  • 自适应动态编译(adaptive dynamic compilation)也是一种动态编译,但它通常执行的时机比JIT编译迟,先让程序“以某种方式”先运行起来,收集一些信息之后再做动态编译。这样的编译可以更加优化。

Numba 的最基础应用就是加速 Python 中的循环操作。

判断什么情况下比较适合使用Numba?

如果代码是使用numpy做数字运算,并且常常有很多的循环,那么使用Numba就是一个很好的选择。

jit装饰器

numba加速,针对数字运算,所以输入输出为数组格式

jit和njit的使用,要不要加(),括号有没有一样不一样

@jit() 里面可以增加参数,不添加参数设置时和jit一样

import jit
@numba.jit
def func(x,y):
    s = 1 
    for i in range(x, y):
        c *= i
    return c

上面这段代码是numba.jit的简单应用,在函数第一次执行的时候,numba推断出参数类型,然后基于这个信息生产优化后的代码。

指定签名

import numba 
@numba.jit(int32(int32, int32))
def func(x,y):
    s = 1 
    for i in range(x, y):
        c *= i
    return c

@numba.jit括号内的是指定签名,编译器将控制类型选择,并不允许其他类型的参数输入,这会带来速度上的优势。

常用的数据类型有:

  • int8, uint8, int16, uint16, int32, uint32, int64,uint64,各种长度整数。图像处理中unit8很常用。
  • float32 ,float64, 单精度浮点数,双精度浮点数
  • complex64 ,complex128, 单精度复数,双精度复数
  • void, 对应python中返回Nothing。
  • intc and uintc 等效于C中的 int 和uint
  • 各种数组类型,如float32[:]表示一维单精度浮点数组,uint8[:,:] 表示二维无符号8位整数数组(常用于图像数组)
  • 元组, 如nb.types.UniTuple(nb.float32, 3) 表示3个元素的元组,元素的类型是float32

重要参数 

编译模式(nopython模式和object模式)

nopython和object是numba的两种编译模式,前者编译的代码更快,但是可能会因为某些限制但是退化为object, 通过nopython=True可以阻止退化并抛出异常。

@njit() 是jit(nopython=True)的默认,@numba.njit与@numba.jit(nopython=True)等价。里面也可以增加设置,比如parallel=True,和prange的使用 只能对数字运算进行加速,建议使用njit,使用起来更加灵活一些

import jit
@numba.njit
def func(x,y):
    s = 1 
    for i in range(x, y):
        c *= i
    return c

nogil

当Numba不需要保持全局线程锁GIL时,可以设定nogil=True,当进入这类编译好的函数时,Numba将会释放全局线程锁。这样可以利用多核系统,但不能使用的函数是在object模式下编译。

@numba.jit(nogil=True)
def func(x,y):
    s = 1 
    for i in range(x, y):
        c *= i
    return c

 cache

想要避免你调用python程序的编译时间,可以通过cache=True来指定numba保存函数编译结果到一个基于文件的缓存中。

@numba.jit(cache=True)
def func(x,y):
    s = 1 
    for i in range(x, y):
        c *= i
    return c

parallel

parallel=True将函数中的操作自动并行化,必须要和nopython=True配合起来一起使用。在定义函数内部,有可并行且不会每次并行之间不会相互影响时使用。编译器将编译一个版本,并行运行多个原生的线程(没有GIL)。简单的for循环的话开启的效果就会比较明显。

@numba.jit(nopython=True, parallel=True)
def func(x,y):
    s = 1 
    for i in numba.prange(x, y):
        c *= i
    return c

boundchecks

什么时候应该 boundchecks 关闭

boundscheck: bool Set to True to enable bounds checking for array indices. Out of bounds accesses will raise IndexError. The default is to not do bounds checking. If bounds checking is disabled, out of bounds accesses can produce garbage results or segfaults. However, enabling bounds checking will slow down typical functions, so it is recommended to only use this flag for debugging. You can also set the NUMBA_BOUNDSCHECK environment variable to 0 or 1 to globally override this flag.

检查数组索引是否不对劲,但是费时间,在保证对的情况下可以设置为False

@numba.njit(boundcheck=False)
def func(x,y):
    s = 1 
    for i in range(x, y):
        c *= i
    return c

常见错误

1、Numba函数参数类型不匹配定义ListType[数组(float64,2d,C)]错误

类型在Numba官方网站上也找不到。让一个基于numba.typeof()返回的解析器函数能够创建装饰器的字符串也是非常有帮助的。注意:运行一定要将@njit(int32(int32))注释掉,否则报错

import numba
from numba import njit, int32


# @njit(int32(int32))
def func(a):
    print(numba.typeof(a))
    return a


func(3)
print(func.inspect_types())

 还有一个超级有用的行来获取numba函数的类型签名:func.inspect_types()

2、RuntimeError: cannot cache function 'square': no locator available for file · Issue #4908 ·

https://github.com/numba/numba/issues/4908https://github.com/numba/numba/issues/4908

为什么python这么慢?numba解决了什么问题? 

这个大神讲的非常好:

为什么python这么慢?numba解决了什么问题? - 知乎


参考:

【深度好文】Python加速库Numba简介

python numba教程_Numba 开发手册(一)_不设目标的博客-CSDN博客

Numba函数参数类型不匹配定义ListType[数组(float64,2d,C)]错误-腾讯云开发者社区-腾讯云

利用numba給Python代码加速 [1]-腾讯云开发者社区-腾讯云

Numba CPU 并行 - 知乎文章来源地址https://www.toymoban.com/news/detail-707735.html

到了这里,关于Numba:加速python代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分享一些Python代码加速工具!

    这篇文章会提供一些优化代码的工具。会让代码变得更简洁,或者更迅速。 当然这些并不能代替算法设计,但是还是能让 Python 加速很多倍。比如适用于双向队列的 deque,以及在合适的条件下运用 bisect 和 heapq 来提升算法的性能。而且前面也提到过,Python 提供了当今最高级也

    2024年02月13日
    浏览(28)
  • 云计算与低代码:加速创新与开发的完美结合

    云计算和低代码开发已成为当今技术领域中备受关注的两大趋势。这两者的结合为企业带来了无限可能,加速了软件开发和创新的速度。本文将探讨云计算和低代码的概念、特点以及它们共同带来的优势。本文将介绍云计算和低代码的概念、优势以及它们如何结合,进而推动

    2024年02月04日
    浏览(42)
  • Python实现视频加速效果(完整代码)

    Python实现视频加速效果(完整代码) 在日常生活中,我们可能需要对某些视频进行编辑,如加速、慢放等效果。Python作为一种以数据分析和计算为主要应用的脚本语言,拥有处理视频的能力。本文将提供Python实现视频加速效果的完整代码,供大家进行参考。 首先我们需要安装所

    2024年02月14日
    浏览(48)
  • Python代码加速100倍,针对Excel自动化处理的加速实战!

    说到并发编程,我们先来澄清一下并发 (Concurrency) 和 并行 ( Parallelism)这两个概念,因为这个两个概念的含义是不同的。 并行(Parallelism)指的就是在同一时刻,有两个或两个以上的任务的代码在处理器上执行。从这个概念我们也可以知道,多个处理器或多核处理器是并行执行

    2024年02月19日
    浏览(43)
  • C++&Python&C# 三语言OpenCV从零开发(6):边界填充+Csharp调用Python matplotlib代码

    C++PythonCsharp in OpenCV 专栏 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程(附带课程课件资料+课件笔记) 今天来接着学习OpenCV,现在主要是以Python代码为主了,所以先实现Python,在用C++/Csharp重现一遍。 边界填充就是向外填充图片信息,将图片扩大。填充分为上下

    2024年01月23日
    浏览(63)
  • 【Python】从同步到异步多核:测试桩性能优化,加速应用的开发和验证

    目录 测试工作中常用到的测试桩mock能力 应用场景 简单测试桩 http.server扩展:一行命令实现一个静态文件服务器 性能优化:使用异步响应 异步响应 能优化:利用多核 gunicorn 安装 gunicorn 使用 gunicorn 启动服务 性能优化:使用缓存(functools.lru_cache)。 单元测试中的mock Python

    2024年02月14日
    浏览(39)
  • 问题解决:ImportError:Numba needs NumPy 1.22 or less

    跑一个以前的代码,总是报错:ImportError:Numba needs NumPy 1.22 or less 查了下,网上都说是numpy的版本不能匹配上Numba,需要安装低版本的numpy,用pip list查看确实是版本没能够达到要求,即1.22版本以下: 网上给的意见大多数是,重新安装低版本的numpy,于是进行了尝试,但是一直

    2024年02月16日
    浏览(52)
  • C语言图形界面开发(演示视频、完整代码文件)

    C语言初学者开始都是在黑白控制台上开发一些小程序,实现一些小功能,因为基础的C语言可视化效果比较差,所展示的都是黑白的字符和数字,比较单调乏味。一些大学的计算机类专业学生,大一学习C语言,学习基础语法和算法,通过平台刷题提高自己编程能力,一般不专

    2024年02月04日
    浏览(43)
  • 【Go 基础篇】Go语言包详解:模块化开发与代码复用

    在Go语言中, 包(Package) 是一种用于组织代码的机制,用于将相关的函数、类型和变量等组织在一起,以便于模块化开发和代码复用。包的使用能够使程序结构更加清晰、可维护性更高,同时也是Go语言强调的一项重要特性。本篇博客将深入探讨Go语言中包的相关知识,包括

    2024年02月11日
    浏览(45)
  • 【开发语言】C语言与Python的互操作详解

    博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客内容主要围绕:        5G/6G协议

    2024年02月10日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包