2016-10-20 10 views
3

私はいつもscipy.linalg.norm()numpy.linalg.norm()を同等とみなしています(軸の引数を受け入れないscipyのバージョンですが、現在はそうしています)。しかし、以下の簡単な例は、パフォーマンスが大きく異なる結果をもたらします。その背後にある理由は何ですか?scipyとnumpy normのパフォーマンスの差

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のはsource codescipyが遅いですが、フローティング扱うnumpy.linalg.normまたはBLAS関数をラップ独自のnorm機能を有していることが明らかになった探し1.11.1

答えて

4

ですポイントがオーバーフローします(この説明はPRを参照)。

しかし、あなたが与えた例では、SciPyがBLAS関数を使用しているように見えないので、私はそれがあなたが見る時間差の原因ではないと思う。しかし、scipyはnumpyバージョンのノルムを呼び出す前にいくつかのチェックを行います。具体的には、無限のチェック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 

だから、np.asarray_chkfiniteのように見えるおよそ規範を評価するのにかかる時間に差を占めています。

関連する問題