适当优化一些计算
Proper optimization of some calculation
尝试用 numpy 优化一段代码,我想知道这是否是正确的方法。
这是计算公式
,矩阵是下三角矩阵。
这是我的尝试:
(np.sum(P) - np.trace(P)) / np.sum(((t[np.newaxis]).T - t) * P)
这是它能做到的最好还是你能找到更有效的方法?
瓶颈似乎是分母的计算,似乎 np.einsum
应该有助于解决这个问题,因为我们正在执行逐元素乘法和求和归约。因此,分母可以这样计算 -
np.einsum('ij,ij',t[:,None]-t, P)
时间和验证 -
In [414]: N = 5000
...: P = np.random.rand(N,N)
...: t = np.random.rand(N)
...: out = (np.sum(P) - np.trace(P)) / np.sum(((t[np.newaxis]).T - t) * P)
...:
# Original method
In [415]: den1 = np.sum(((t[np.newaxis]).T - t) * P)
# Proposed method
In [416]: den2 = np.einsum('ij,ij',t[:,None]-t, P)
In [417]: np.allclose(den1, den2)
Out[417]: True
In [419]: %timeit np.sum(((t[np.newaxis]).T - t) *P)
10 loops, best of 3: 86.9 ms per loop
In [420]: %timeit np.einsum('ij,ij',t[:,None]-t, P)
10 loops, best of 3: 49.7 ms per loop
对于分子,似乎大部分运行时间都花在了 np.sum(P)
:
In [422]: %timeit (np.sum(P) - np.trace(P))
100 loops, best of 3: 10.4 ms per loop
In [423]: %timeit np.sum(P)
100 loops, best of 3: 10.4 ms per loop
因此,我们可以保留分子原样。
尝试用 numpy 优化一段代码,我想知道这是否是正确的方法。
这是计算公式 ,矩阵是下三角矩阵。
这是我的尝试:
(np.sum(P) - np.trace(P)) / np.sum(((t[np.newaxis]).T - t) * P)
这是它能做到的最好还是你能找到更有效的方法?
瓶颈似乎是分母的计算,似乎 np.einsum
应该有助于解决这个问题,因为我们正在执行逐元素乘法和求和归约。因此,分母可以这样计算 -
np.einsum('ij,ij',t[:,None]-t, P)
时间和验证 -
In [414]: N = 5000
...: P = np.random.rand(N,N)
...: t = np.random.rand(N)
...: out = (np.sum(P) - np.trace(P)) / np.sum(((t[np.newaxis]).T - t) * P)
...:
# Original method
In [415]: den1 = np.sum(((t[np.newaxis]).T - t) * P)
# Proposed method
In [416]: den2 = np.einsum('ij,ij',t[:,None]-t, P)
In [417]: np.allclose(den1, den2)
Out[417]: True
In [419]: %timeit np.sum(((t[np.newaxis]).T - t) *P)
10 loops, best of 3: 86.9 ms per loop
In [420]: %timeit np.einsum('ij,ij',t[:,None]-t, P)
10 loops, best of 3: 49.7 ms per loop
对于分子,似乎大部分运行时间都花在了 np.sum(P)
:
In [422]: %timeit (np.sum(P) - np.trace(P))
100 loops, best of 3: 10.4 ms per loop
In [423]: %timeit np.sum(P)
100 loops, best of 3: 10.4 ms per loop
因此,我们可以保留分子原样。