Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 某些计算的适当优化_Python_Numpy_Optimization_Linear Algebra - Fatal编程技术网

Python 某些计算的适当优化

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]

试图用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]: 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