<p>刚刚在<a href="http://www.reddit.com/r/Python/comments/218yxo/great_stackoverflow_post_using_numpyeinsum_is_18x/" rel="noreferrer">reddit</a>上看到了一个非常好的评论,它可能会让事情更快一点:</p>
<blockquote>
<p>This is not surprising to anyone who uses numpy regularly. For loops
in python are horribly slow. Actually, einsum is pretty slow too.
Here's a version that is faster if you have lots of vectors (500
vectors in 4 dimensions is enough to make this version faster than
einsum on my machine):</p>
</blockquote>
<pre><code>def no_einsum(d, mean, Sigma):
L_inv = np.linalg.inv(numpy.linalg.cholesky(Sigma))
xdiff = d - mean
return np.sum(np.dot(xdiff, L_inv.T)**2, axis=1)
</code></pre>
<blockquote>
<p>If your points are also high dimensional then computing the inverse is
slow (and generally a bad idea anyway) and you can save time by
solving the system directly (500 vectors in 250 dimensions is enough
to make this version the fastest on my machine):</p>
</blockquote>
<pre><code>def no_einsum_solve(d, mean, Sigma):
L = numpy.linalg.cholesky(Sigma)
xdiff = d - mean
return np.sum(np.linalg.solve(L, xdiff.T)**2, axis=0)
</code></pre>