我想使用numba
在numpy
中执行'daxpy'操作(向矢量添加第二个矢量的标量倍数并将结果分配给第一个),通过以下测试,我发现手写循环比执行a += c * b
更快。
我没有预料到这样的结果。这种行为的原因是什么?
import numpy as np
from numba import jit
x = np.random.random(int(1e6))
o = np.random.random(int(1e6))
c = 3.4
@jit(nopython=True)
def test1(a, b, c):
a += c * b
return a
@jit(nopython=True)
def test2(a, b, c):
for i in range(len(a)):
a[i] += c * b[i]
return a
%timeit -n100 -r10 test1(x, o, c)
>>> 100 loops, best of 10: 2.48 ms per loop
%timeit -n100 -r10 test2(x, o, c)
>>> 100 loops, best of 10: 1.2 ms per loop
+=
运算符,numba
就能够很明显地高效地解决它。我认为这里是一种特殊情况,因为例如点积np.dot
在速度方面是无法被超越的。 - NoBackingDownnp.dot
是一个特殊情况。numpy
会调用你安装的各种BLAS库,可能是一些高度优化的库,比如英特尔的MKL。 - chrisb