为啥 np.linalg.norm(x,2) 比直接求解慢?

Posted

技术标签:

【中文标题】为啥 np.linalg.norm(x,2) 比直接求解慢?【英文标题】:Why is np.linalg.norm(x,2) slower than solving it directly?为什么 np.linalg.norm(x,2) 比直接求解慢? 【发布时间】:2018-10-14 15:09:13 【问题描述】:

示例代码:

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() 这么慢?

【问题讨论】:

【参考方案1】:

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 上可能会感兴趣。

【讨论】:

有点题外话,只是出于好奇,你知道如何计算 p!=2 的算子范数吗?【参考方案2】:

可比较的是:

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 都不是一回事。

【讨论】:

以上是关于为啥 np.linalg.norm(x,2) 比直接求解慢?的主要内容,如果未能解决你的问题,请参考以下文章

numpy求矩阵范数 ||x|| (np.linalg.norm)

对向量进行计算的函数:np.linalg.norm

numpy.linalg.norm(求范数)

关于范数

python:numpy,详解:np.linalg.norm()求范数,计算两向量对应点欧式距离。

三种不同的方式,计算欧氏距离,速度比较