python - 为什么 np.linalg.norm(x,2) 比直接求解慢?
问题描述
示例代码:
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 范数
这些操作是不同的,因此它们花费不同的时间也就不足为奇了。Frobenius 范数和矩阵的 2 范数有什么区别?关于 math.SO 可能会感兴趣。
推荐阅读
- continuous-integration - 如何重用柑橘框架中的场景?
- flutter - Flutter 热重载期间的内部编译器错误消息:
- excel - 尽管值发生了许多变化,但我在 vba 中的代码仅产生 0 作为结果
- javascript - 如何找到对象数组中两个节点之间的最短路径?
- php - 如何使用 .htaccess 将第二个参数传递给 php 代码?
- python - 如何使用 python 在 Messenger-Dialogflow 聊天机器人中将 Mysql 查询结果作为 Excel 报告发送
- angularjs - 在屏蔽 ui 图表的 x 轴上显示日期时间
- ros - 来自点云的 XYZ
- c - 如何在 C 项目中添加汇编代码?
- c# - 尝试/捕获不捕获 HttpListenerException