Code前端首页关于Code前端联系我们

numba,让python科学计算快一百倍

terry 2年前 (2023-09-25) 阅读数 48 #后端开发
numba,让python科学计算速度提升百倍

由于其动态解释语言的特点,python执行代码比java和c++慢很多,尤其是在做科学计算的时候,几十亿、几百亿的计算,这个Python的缺点更加明显。

解决办法总是比困难多。 numba是解决Python速度慢问题的好工具,可以使Python的速度提高数百倍! numba,让python科学计算速度提升百倍


numba是什么?

numba是一个JIT编译器,可以将python函数翻译成机器代码。 numba编译的Python代码(仅表操作)可以以接近C或FORTRAN的速度运行。 numba,让python科学计算速度提升百倍

python之所以慢是因为它是由CPython编译的。numba的使命是将 python 改为不同的编译器。 numba,让python科学计算速度提升百倍 Python、C 和 numba 编译器的速度比较

使用 numba 非常简单。您所要做的就是将 numba 装饰器应用到 python 函数。无需更改原有Python代码。numba将自动完成剩下的工作。

import numpy as np
import numba
from numba import jit

@jit(nopython=True) # jit,numba装饰器中的一种
def go_fast(a): # 首次调用时,函数被编译为机器代码
    trace = 0
    # 假设输入变量是numpy数组
    for i in range(a.shape[0]):   # Numba 擅长处理循环
        trace += np.tanh(a[i, i]) 
    return a + trace

上面的代码是一个Python函数,用于计算numpy数组中每个值的双曲正切。我们使用numba装饰器,它将这个python函数编译成相应的机器代码,这样可以显着减少执行时间。


numba适合科学计算

numpy是专为面向numpy表的计算任务而设计的。

在基于矩阵的计算任务中,数据并行对于 GPU 等加速器来说是很自然的。 Numba 了解 NumPy 数组类型并使用它们为 GPU 或多核 CPU 执行生成高效的编译代码。特殊设计者还可以创建返回 numpy 数组的函数,例如 numpy 函数。

什么时候应该使用numba?

  • 使用numpy表做很多科学计算时
  • 使用循环时

学习如何使用numba

第一步:带上其他numpy,numba♓步骤:回车numba 装饰器 jit 并输入函数

# 传入jit,numba装饰器中的一种
@jit(nopython=True) 
def go_fast(a): # 首次调用时,函数被编译为机器代码
    trace = 0
    # 假设输入变量是numpy数组
    for i in range(a.shape[0]):   # Numba 擅长处理循环
        trace += np.tanh(a[i, i])  # numba喜欢numpy函数
    return a + trace # numba喜欢numpy广播

选项 nopython=True 要求函数完全编译(以完全删除 Python 解释器调用),否则将抛出异常。这些异常通常表示需要修改函数位置以获得比 Python 更好的性能。强烈建议您始终使用 nopython=True。

第 3 步:将实际参数传递给函数

# 因为函数要求传入的参数是nunpy数组
x = np.arange(100).reshape(10, 10) 
# 执行函数
go_fast(x)

第 4 步:numba 加速函数执行时间 3.❙ µs ± 156 ns 每个循环(平均值 ± 标准 7 次运行,100,000 次)每个循环)

第 5 步:无 numba 加速的函数执行时间

def go_fast(a): # 首次调用时,函数被编译为机器代码
    trace = 0
    # 假设输入变量是numpy数组
    for i in range(a.shape[0]):   # Numba 擅长处理循环
        trace += np.tanh(a[i, i])  # numba喜欢numpy函数
    return a + trace # numba喜欢numpy广播

x = np.arange(100).reshape(10, 10) 
%timeit go_fast(x)

结果:
每个循环。 13天d.开发7次,每次10000次循环)

结论:

在numba加速下,代码的执行时间为3.63微秒/循环。如果没有numba的加速,代码的执行时间为136微秒/周期。与这两者相比,前一个快40倍。


numba 让 Python 飞起来

我对比过使用 numba 前后,Python 代码的速度提高了 40 倍,但这还不是最快的。

这次我们不使用 numpy 数组,仅使用 for 循环。让我们看看nunba有多喜欢循环!

# 不使用numba的情况
def t():
    x = 0
    for i in np.arange(5000):
        x += i
    return x
%timeit(t())

输出:

408 µs ± 9.73 µs 每个循环(平均值 ± 标准开发 7 次运行,每个 1000 个循环)

# 使用numba的情况
@jit(nopython=True) 
def t():
    x = 0
    for i in np.arange(5000):
        x += i
    return x
%timeit(t()) 

± 5❙ .1 .1 s.8 ns 每个循环(平均值 ± 标准.7次运行,每次1000000次循环)

使用numba前后的速度分别为408微秒/周期和1.57微秒/周期。速度提升了200很多倍!


结论

numba极大地提高了Python代码的执行速度,这对于Python在大数据时代分析数据的能力做出了巨大的贡献。对于数据科学家来说,这真是一个幸运的工具!

当然,除了 numpy 和 for 循环之外,numba 对 python 代码没有任何帮助。不要指望numba会帮助您加快从数据库中检索数据的速度。这实在做不到。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门