我目前正在研究使用Numba来加速我的python软件。我对这个概念完全陌生,目前正在努力学习绝对的基础知识。我现在坚持的是:
我不明白,vectorize装饰器的大好处是什么。
文档解释说,装饰器用于将普通的python函数转换为Numpy ufunc。根据我的理解,ufunc的好处是,它可以采用numpy数组(而不是标量)并提供广播等功能。
但是我可以在网上找到的所有例子都可以在没有这个装饰器的情况下轻松解决。
例如,这个例子来自numba文档。
@vectorize([float64(float64, float64)])
def f(x, y):
return x + y
他们声称,现在这个功能就像一个numpy ufunc。但是,即使没有装饰者,它也不是吗?如果我只是运行以下代码:
def f(x,y):
return x+y
x = np.arange(10)
y = np.arange(10)
print(f(x,y))
这工作同样好。该函数已经接受了除标量之外的类型的参数。
我在这里误解了什么?
只需阅读以下几行文档:
你可能会问自己,“为什么我要经历这个而不是使用@jit装饰器编译一个简单的迭代循环?”。答案是NumPy ufuncs会自动获得其他功能,如缩小,累积或广播。
例如,f.reduce(arr)
将以C速度将arr
的所有元素加起来,f
不能。