ここのスレッドを考えると
numpy は、超高速計算には最適ではないようです。数値計算に numpy を使用するときに注意する必要があるオーバーヘッドを知っている人はいますか?
ここのスレッドを考えると
numpy は、超高速計算には最適ではないようです。数値計算に numpy を使用するときに注意する必要があるオーバーヘッドを知っている人はいますか?
まあ、あなたが何をしたいかによります。たとえば、XOR は、数値線形代数を行うことに関心のある人にはほとんど関係ありません (最適化された BLAS/LAPACK ライブラリを使用することにより、numpy はかなり高速です)。
一般に、numpy から優れたパフォーマンスを得るための背後にある大きなアイデアは、一度に多くの要素に対してインタープリターのコストを償却することです。つまり、ループを Python コード (遅い) から numpy/BLAS/LAPACK/etc のどこかにある C/Fortran ループに移動します。内部 (高速)。その操作 (ベクトル化と呼ばれる) に成功すると、パフォーマンスは通常非常に高くなります。
もちろん、Python インタープリターをダンプし、代わりにたとえば C++ を使用することで、明らかにさらに優れたパフォーマンスを得ることができます。このアプローチが実際に成功するかどうかは、C++ と numpy を使用した高性能プログラミングがどれだけ得意であるか、および正確にどの操作を実行しようとしているかによって異なります。
のような式がある場合はx = a * b + c / d + e
常に、1つのa * b
一時配列、1つの一時配列c / d
、1つの合計、最後に1つの結果の割り当てになります。これは、Pythonタイプと演算子のオーバーロードの制限です。*=
ただし、拡張代入( 、、+=
など)演算子を使用して、その場で明示的に処理を行うことができ、コピーが作成されないことが保証されます。
そのベンチマークでNumPyのパフォーマンスが遅い具体的な理由については、わかりにくいですが、Cythonなどのサイズのチェックやタイプマーシャリングなどの一定のオーバーヘッドに関係している可能性があります。心配する必要はありません。より大きな問題では、おそらくそれが近づくのを見るでしょう。
はっきりとはわかりませんが、2つの要因があると思います。
おそらく、numpyはもっと多くのものをコピーしていますか?大きな一時配列の割り当てを避けると、多くの場合、織り方が速くなりますが、ここでは問題になりません。
numpyには、(おそらく)多次元配列の反復処理に使用されるオーバーヘッドが少しあります。このオーバーヘッドは通常、数値の計算によって小さくなりますが、xorは非常に高速であるため、実際に重要なのはオーバーヘッドだけです。
あなたの副次的な質問: a = sin(x), 何回の往復がありますか?
トリックは、numpy 配列を sin(x) に渡すことです。numpy は sin 値の配列を返すため、配列全体に対して「ラウンドトリップ」は 1 つだけです。この操作に関係する python for ループはありません。