为什么 np.linalg.norm(x,2) 比直接求解慢?
Why is np.linalg.norm(x,2) slower than solving it directly?
示例代码:
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()求解需要3s以上,而直接求解只需0.01s。为什么 np.linalg.norm() 这么慢?
np.linalg.norm(x, 2)
计算 2-范数,取最大的奇异值
math.sqrt(np.sum(x*x))
计算 frobenius 范数
这些操作是不同的,因此它们花费不同的时间也就不足为奇了。 What is the difference between the Frobenius norm and the 2-norm of a matrix? 对 math.SO 可能感兴趣。
比较的是:
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
都不是一回事。
示例代码:
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()求解需要3s以上,而直接求解只需0.01s。为什么 np.linalg.norm() 这么慢?
np.linalg.norm(x, 2)
计算 2-范数,取最大的奇异值
math.sqrt(np.sum(x*x))
计算 frobenius 范数
这些操作是不同的,因此它们花费不同的时间也就不足为奇了。 What is the difference between the Frobenius norm and the 2-norm of a matrix? 对 math.SO 可能感兴趣。
比较的是:
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
都不是一回事。