【发布时间】:2021-03-05 00:04:21
【问题描述】:
为了将矩阵X 的行标准化为单位长度,我通常使用:
X /= np.linalg.norm(X, axis=1, keepdims=True)
尝试优化算法的这个操作,我很惊讶地发现在我的机器上写出规范化的速度大约快 40%:
X /= np.sqrt(X[:,0]**2+X[:,1]**2+X[:,2]**2)[:,np.newaxis]
X /= np.sqrt(sum(X[:,i]**2 for i in range(X.shape[1])))[:,np.newaxis]
怎么来的? np.linalg.norm()的性能损失在哪里?
import numpy as np
X = np.random.randn(10000,3)
%timeit X/np.linalg.norm(X,axis=1, keepdims=True)
# 276 µs ± 4.55 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit X/np.sqrt(X[:,0]**2+X[:,1]**2+X[:,2]**2)[:,np.newaxis]
# 169 µs ± 1.38 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit X/np.sqrt(sum(X[:,i]**2 for i in range(X.shape[1])))[:,np.newaxis]
# 185 µs ± 4.17 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
我在支持 OpenBLAS 的 MacbookPro 2015 上观察到 (1) python3.6 + numpy v1.17.2 和 (2) python3.9 + numpy v1.19.3 的情况。
我不认为这是 this post 的重复,它解决了矩阵范数,而这个是关于向量的 L2 范数。
【问题讨论】:
-
查看源代码,它在后台处理了很多事情,这很可能就是原因所在。 “检查”这一点的一种快速方法是复制粘贴源,但删除所有不适用的杂物,然后再次运行测试
-
您可以尝试逐行分析。 stackoverflow.com/questions/3927628/…
-
@IanQuah this line 消耗了大部分时间。