Почему np.linalg.norm (x, 2) медленнее, чем его непосредственное решение? - PullRequest
0 голосов
/ 14 октября 2018

Пример кода:

import numpy as np
import math
import time

x=np.ones((2000,2000))

start = time.time()
print(np.linalg.norm(x, 2))
end = time.time()
print("time 1: " + str(end - start))

start = time.time()
print(math.sqrt(np.sum(x*x)))
end = time.time()
print("time 2: " + str(end - start))

Вывод (на моем компьютере):

1999.999999999991
time 1: 3.216777801513672
2000.0
time 2: 0.015042781829833984

Это показывает, что np.linalg.norm () занимает более 3 с, чтобы его решитьв то время как прямое решение занимает всего 0,01 с.Почему np.linalg.norm () такой медленный?

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

То, что сопоставимо:

In [10]: %timeit sum(x*x,axis=1)**.5
36.4 ms ± 6.11 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [11]: %timeit norm(x,axis=1)
32.3 ms ± 3.94 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

Ни np.linalg.norm(x, 2), ни sum(x*x)**.5 не одно и то же.

0 голосов
/ 14 октября 2018

np.linalg.norm(x, 2) вычисляет 2-норму, принимая наибольшее единственное значение

math.sqrt(np.sum(x*x)) вычисляет норму Фробениуса

Эти операции различны, поэтому не удивительно, что они принимаютразное количество времени. В чем разница между нормой Фробениуса и 2-нормой матрицы? по математике. SO может представлять интерес.

...