Python scipy和numpy标准之间的性能差异

Python scipy和numpy标准之间的性能差异,python,numpy,scipy,Python,Numpy,Scipy,我一直假设scipy.linalg.norm()和numpy.linalg.norm()是等效的(scipy版本过去不接受axis参数,但现在它接受)。然而,以下简单的例子产生了显著不同的性能:这背后的原因是什么 In [1]: from scipy.linalg import norm as normsp In [2]: from numpy.linalg import norm as normnp In [3]: import numpy as np In [4]: a = np.rand

我一直假设
scipy.linalg.norm()
numpy.linalg.norm()
是等效的(scipy版本过去不接受axis参数,但现在它接受)。然而,以下简单的例子产生了显著不同的性能:这背后的原因是什么

In [1]: from scipy.linalg import norm as normsp
In [2]: from numpy.linalg import norm as normnp 
In [3]: import numpy as np
In [4]: a = np.random.random(size=(1000, 2000))

In [5]: %timeit normsp(a)
The slowest run took 5.69 times longer than the fastest. This could mean that an intermediate result is being cached.
100 loops, best of 3: 2.85 ms per loop

In [6]: %timeit normnp(a)
The slowest run took 6.39 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 558 µs per loop
scipy版本为0.18.1,numpy版本为1.11.1

查看后发现,
scipy
有自己的
norm
函数,它围绕着
numpy.linalg.norm
或一个速度较慢但处理浮点溢出更好的BLAS函数(参见对此的讨论)

然而,在您给出的示例中,SciPy似乎并没有使用BLAS函数,因此我认为这与您看到的时差无关。但是scipy在调用norm的numpy版本之前做了一些其他检查。特别是,无限检查
a=np.asarray\u chkfinite(a)
可能导致性能差异:

In [103]: %timeit normsp(a)
100 loops, best of 3: 5.1 ms per loop

In [104]: %timeit normnp(a)
1000 loops, best of 3: 744 µs per loop

In [105]: %timeit np.asarray_chkfinite(a)
100 loops, best of 3: 4.13 ms per loop
所以它看起来像是
np。asarray\u chkfinite
大致解释了评估标准所用时间的差异