2016-10-20 2 views
3

Я всегда предполагал, что scipy.linalg.norm() и numpy.linalg.norm() эквивалентны (версия scipy используется, чтобы не принимать аргумент оси, но теперь это так). Однако следующие простые примеры дают существенно разные характеристики: в чем причина этого?Разница в производительности между нормой scipy и numpy

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, 1.11.1 NumPy является

ответ

4

Глядя source code показывает, что scipy имеет свою собственную norm функцию, которая оборачивается вокруг или функции numpy.linalg.norm BLAS, которая медленнее, но обрабатывает плавающие (см. обсуждение по этому вопросу 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 примерно объясняет разницу во время, принятой для оценки норм.

Смежные вопросы