2017-05-30 68 views
0

试图用numpy优化一段代码,我想知道这是否是正确的方法。适当的优化一些计算

这里是计算公式 ,矩阵是下三角。

1

这里是我的尝试:

(np.sum(P) - np.trace(P))/np.sum(((t[np.newaxis]).T - t) * P) 

这是好,因为它可以得到,或者你可以看到一个更有效的方法?

+2

似乎有'p'和'P'。这是打算还是有错别字? – Divakar

+0

谢谢Divakar,这是一个错字(编辑)。我担心部分(t [np.newaxis])。T - t),因为我认为它会创建另一个n * n矩阵,这不正确吗?那么在这种情况下,简洁是或不是正确的方法? –

+1

除非您计划在那里写答案,否则请不要推荐代码复审。如果你在CR上没有'numpy'相关的代表点,你不知道什么是合适的。这不是完整的工作副本。不要被“优化”一词的不同用法所困惑。 – hpaulj

回答

1

瓶颈似乎是分母的计算,看起来像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 

所以,我们可以让分子保持原样。