4

ご挨拶、

これがばかげた質問かどうかはわかりません。

3 つの numpy 配列 A1、A2、A3、および 3 つの浮動小数点数 c1、c2、c3 があるとします。

B = A1*c1+ A2*c2+ A3*c3 を評価したい

たとえば、これを numpy で計算します。

 E1 = A1*c1
 E2 = A2*c2
 E3 = A3*c3
 D1 = E1+E2
 B = D1+E3

それともそれよりも賢いですか?C++ では、この種の操作をうまく抽象化する方法がありました。

一連の一般的な 'LC' テンプレート関数を定義しました。線形結合の LC は次のようになります。

template<class T,class D>
void LC( T & R,
    T & L0,D C0,
    T & L1,D C1,
    T & L2,D C2)
{
    R = L0*C0
        +L1*C1
        +L2*C2;        
}

これをさまざまなタイプに特化し、

たとえば、配列の場合、コードは次のようになります

for (int i=0; i<L0.length; i++)
    R.array[i] =
    L0.array[i]*C0 +
    L1.array[i]*C1 +
    L2.array[i]*C2;

したがって、新しい中間配列を作成する必要がなくなります。

これは面倒に見えるかもしれませんが、本当にうまくいきました。

Pythonでも同様のことができますが、必要かどうかはわかりません。

洞察をお寄せいただきありがとうございます。-ニック

4

2 に答える 2

7

理論的にnumpyは、いつでも内部をアップグレードして素晴らしい最適化を実行できますが、現時点ではそうではありません:B = A1*c1 + A2*c2 + A3*c3実際に中間の一時配列を生成してから破棄します (もちろん、補助メモリを「消費」しますが、他には何もありません)。 .

B = A1 * c1したがって、この時点B += A2 * c2; B += A3 * c3で再びが続く は、その一時メモリの一部を消費することを回避します。

もちろん、実際のメモリが不足している環境 (補助メモリの一部が単なる仮想メモリであり、ページ フォールトにつながる) で動作し、十分に大きな配列が "消費" される場合にのみ、違いがわかります。すべての実メモリ、次にいくつか。ただし、このような極端な状況では、少しリファクタリングするだけでパフォーマンスを向上させることができます。

于 2010-05-30T05:46:31.423 に答える
3

これがnumexpr (Python および NumPy 用の高速数値配列式評価器) の背後にある考え方です。独自のルーチンをコンパイルする前に、このパッケージを試してみてください。

于 2010-05-30T12:06:47.790 に答える