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

由于其动态解释语言的特点,python执行代码比java和c++慢很多,尤其是在做科学计算的时候,几十亿、几百亿的计算,这个Python的缺点更加明显。
解决办法总是比困难多。 numba是解决Python速度慢问题的好工具,可以使Python的速度提高数百倍!
numba是什么?
numba是一个JIT编译器,可以将python函数翻译成机器代码。 numba编译的Python代码(仅表操作)可以以接近C或FORTRAN的速度运行。
python之所以慢是因为它是由CPython编译的。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前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。