P. *_*eri 5 python numpy scipy
我一直假设scipy.linalg.norm()并且numpy.linalg.norm()是等效的(scipy 版本过去不接受轴参数,但现在接受了)。但是,以下简单示例产生了显着不同的性能:这背后的原因是什么?
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
Run Code Online (Sandbox Code Playgroud)
scipy 版本是 0.18.1,numpy 是 1.11.1
查看源代码会发现它scipy有自己的norm函数,它环绕numpy.linalg.norm或 BLAS 函数,该函数较慢但可以更好地处理浮点溢出(请参阅有关此PR 的讨论)。
但是,在您提供的示例中,它看起来不像 SciPy 使用 BLAS 函数,所以我认为它不是您看到的时差的原因。但是 scipy 在调用 numpy 版本的 norm 之前确实做了一些其他检查。特别是,无限检查a = np.asarray_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
Run Code Online (Sandbox Code Playgroud)
所以它看起来np.asarray_chkfinite大致解释了评估规范所花费的时间差异。
| 归档时间: |
|
| 查看次数: |
1200 次 |
| 最近记录: |