Python 某些计算的适当优化
试图用numpy优化一段代码,我想知道这是否是正确的方法 这是计算公式 ,矩阵为下三角形 以下是我的尝试:Python 某些计算的适当优化,python,numpy,optimization,linear-algebra,Python,Numpy,Optimization,Linear Algebra,试图用numpy优化一段代码,我想知道这是否是正确的方法 这是计算公式 ,矩阵为下三角形 以下是我的尝试: (np.sum(P) - np.trace(P)) / np.sum(((t[np.newaxis]).T - t) * P) 这是它能得到的最好的结果,还是你能找到一种更有效的方法?瓶颈似乎是分母的计算,在我们执行元素级乘法和求和缩减时,这似乎应该有所帮助。因此,分母可以这样计算- np.einsum('ij,ij',t[:,None]-t, P) 时间安排和核查- In [414]
(np.sum(P) - np.trace(P)) / np.sum(((t[np.newaxis]).T - t) * P)
这是它能得到的最好的结果,还是你能找到一种更有效的方法?瓶颈似乎是分母的计算,在我们执行元素级乘法和求和缩减时,这似乎应该有所帮助。因此,分母可以这样计算-
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.sumP上:
所以,我们可以让分子保持原样。似乎有p和p。这是故意的还是有错别字?谢谢Divakar,这是一个错别字。我关心的是部分t[np.newaxis].t-t,因为我认为它将创建另一个n*n矩阵,对吗?因此,在这种情况下,简洁是或不是正确的方法?请不要建议代码审查,除非您计划在那里写一个答案。如果你在CR上没有与numpy相关的rep积分,你就不知道什么是好的匹配。这不是完全有效的副本。不要被“优化”一词的不同用法所迷惑。@aryamcarthy请看一下代码评审。在代码评审中,当前形式的此类问题是不可接受的。
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