0
numpyでコードを最適化しようとしていますが、これが正しいアプローチであるかどうかは疑問です。計算の適切な最適化
ここで計算の式は です。この行列は下三角です。
そして、ここに私の試みです:
(np.sum(P) - np.trace(P))/np.sum(((t[np.newaxis]).T - t) * P)
それが得ることができるか、より効率的な方法を見ることができるように良い本ですか?
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
分子をそのまま残すことができます。
'p'と' P'があるようです。それは意図されているのですか? – Divakar
Divakarありがとう、それはタイプミス(編集)だった。私はその部分(t [np.newaxis])を心配しています。別のn * n行列を作成すると思いますが、それは間違いですか?したがって、この場合、簡潔さは適切なアプローチですか、そうではありませんか? –
答えを書くつもりがない限り、Code Reviewはお勧めしません。あなたがCR上に 'numpy'関連のポイントを持っていなければ、何が良いものか分かりません。これは完全に作業コピーではありません。また、用語「最適化」のさまざまな使用法を混同しないでください。 – hpaulj