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

Numba是一款JIT编译器,能够将Python函数编译为机器码,显著提高数值运算效率。通过@jit装饰器,Numba可以优化函数,使其运行速度接近C或FORTRAN。在本文中,我们介绍了Numba的安装、基本用法,以及如何通过@jit和@njit进一步提升性能。对于涉及大量数值计算的场景,Numba是一个强大的工具。
摘要由CSDN通过智能技术生成

在这里插入图片描述

1. Numba是什么?

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

2. 如何安装Numba?

我们可以通过conda或者pip来进行安装,命令如下:

$ conda install numba

或者

$ pip install numba

3. 初识Numba

为了加强大家对Numba库的直观了解,我们首先以求二维数组元素之和作为例子来讲解。

1) 常规实现

为了求二维数据元素之和,最简单直接的实现如下所示:

def sum_matrix(M):
    N1, N2 = M.shape
    result = 0
    for i in range(N1):
        for j in range(N2):
            result += M[i, j]
    return result

2) numpy实现

作为对比,可以使用numpy直接求和,调用函数np.sum(),代码如下:

import numpy as np
def sum_numpy(M):
    return np.sum(M)

3) numba实现

尽管numpy库有实现二维数组求和的现成函数 np.sum ,使用numba中的jit可以将函数 sum_matrix运行的和np.sum一样快。只需要将sum_matrix作为参数传递给jit即可。

from numba import jit
def sum_jit(M):
    sum_matrix_jit = jit()(sum_matrix)
    return sum_matrix_jit

4)性能对比

为了统计上述函数运行时间,我们统计三个函数的运行时间如下所示:

def print_run_time(func,M,loops):
    start = time.time()
    for _ in range(loops):
        func(M)
    end = time.time()
    print('current Function [%s] run time is %.2f' % (func.__name__ ,end - start))

if __name__ == "__main__":
    np.random.seed(1234)
    M = np.random.random([int(4e3)] * 2)
    loops = 5
    print_run_time(sum_matrix,M,loops)
    print_run_time(sum_numpy,M,loops)
    print_run_time(sum_jit,M,loops)

运行结果如下:
在这里插入图片描述

4. Numba进阶

1)使用@jit 装饰器

使用jit来转换函数,一种更为常见的方式是使用装饰器的写法,如下所示:

@jit
def sum_matrix_jit(M):
    N1, N2 = M.shape
    result = 0
    for i in range(N1):
        for j in range(N2):
            result += M[i, j]
    return result

2)使用nopython and @njit

如果希望使用jit加速后的函数完全不受Python解释器的干涉,我们可以使用nopython或者@njit,这种模式下将会提供一个最优的性能来优化for循环。如果代码涉及非数值处理情形,python解释器是重要的,必须避免使用该模式。代码实现如下:

from numba import njit
@njit # or @jit(nopython=True)
def sum_matrix_njit(M):
    N1, N2 = M.shape
    result = 0
    for i in range(N1):
        for j in range(N2):
            result += M[i, j]
    return result

3)性能对比

为了对比使用@jit和@njit,参考上述例子二者的对比实验如下:

if __name__ == "__main__":
    np.random.seed(1234)
    M = np.random.random([int(4e3)] * 2)
    loops = 5
    print_run_time(sum_matrix_jit,M,loops)
    print_run_time(sum_matrix_njit, M, loops)

运行结果如下:
在这里插入图片描述

5. 总结

本文简单介绍了numba库的安装和常见的使用方法,针对数值运算的python函数,只需要添加简单的@jit装饰器,就可以让运行速度大幅提升,强烈推荐大家在日常的工作学习中使用。



6. 参考

参考 链接一 链接二




关注公众号《AI算法之道》,获取更多AI算法资讯。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵卓不凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值