x n行列z
に格納されているnベクトルのセットがあります。 np.einsum
を使用して外積を見つけます。私がそれを使用して時間を計ったとき:
%timeit v=np.einsum('i...,j...->ij...',z,z)
結果が出ました:
The slowest run took 7.23 times longer than the fastest. This could mean that an
intermediate result is being cached
100000 loops, best of 3: 2.9 µs per loop
ここで何が起こっているのでしょうか。最高の3は2.9usですが、最も遅いのはおそらくもっと典型的です。
「中間結果がキャッシュされています」というメッセージは、%timeitによって報告された返信定型文の単なる推測です。それは真実かもしれないしそうでないかもしれません、そしてあなたはそれが正しいと仮定するべきではありません。
特に、最初の実行が最も遅い最も一般的な理由の1つは、最初の実行後にのみ配列が CPUキャッシュ にあることです。
CPUは物事を自動的にキャッシュします。あなたはこれを避けることはできません、そしてあなたは本当にそれを避けたくありません。ただし、CPUキャッシュが最適に機能するようにアルゴリズムを最適化することは、現在、ハイパフォーマンスコンピューティングで考慮する必要のあるボトルネックの1つです。