繁体   English   中英

为什么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))计算math.sqrt(np.sum(x*x))范数

这些操作是不同的,因此花费不同的时间也就不足为奇了。 Frobenius范数和矩阵的2范数有什么区别? 对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是相同的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM