2

いくつかの変数の多項式の項を評価する関数があります。入力は、各変数の累乗のリストです。たとえば、2つの変数と2次の場合、次のようになります。

def f(x,y):
    return [1, x[1], y[1], x[1]*y[1], x[2], y[2]]

x = [2**0, 2**1, 2**2]
y = [3**0, 3**1, 3**2]

>>> f(x,y)
[1,2,3,6,4,9]

実際には、関数は高階で多くの変数を持っているため、平均して数千の項があります(実際、実行時にevalステートメントを使用して関数を作成しますが、それは重要ではありません)。この関数は最も内側のループにあり、現在は速度のボトルネックになっています。プロファイラーは、私がほとんどの時間を__times__で過ごすと言っています。

C拡張モジュールを作成する以外に、最適化の余地がある人はいますか?

編集:上記の例では、とを使用して評価しようとして1 + x + y + xy + x^2 + y^2x = 2ますy = 3。ただし、追加せずに、各用語をリストに追加するだけです。

それらを追加することは問題ありません(いくつかの係数A、B、...)。つまり、私がやろうとしているのは計算だけです。

A + B*x + C*y + D*x*y + E*x^2 + F*y^2

4

2 に答える 2

3

どのバージョンからのものかはわかりませんが、numpypolyval2d(x,y,c)にはモジュールに関数が含まれている必要がありpolynomialます。これは、例に完全に当てはまります。

あなたは自分の例をもっと高い次元に拡大することに興味を持っているようでした。

同じモジュールに、があります。それでも不十分な場合は、ソースコードpolyval3d(x,y,z,c)を確認することをお勧めします(すでに行っていると思いますが)。ニーズに最適なものを実装するのはそれほど難しいことではありません。SOでいつでも質問できます:)

于 2012-04-08T09:00:03.670 に答える
0

この関数は最も内側のループにあり、現在は速度のボトルネックになっています。

NumPyを使用し、変数をより高次元の配列に置き換えることで、ループを完全に取り除くことができます。

于 2012-04-08T14:52:56.280 に答える