2

私はまだPythonにはかなり慣れていないので、この質問がばかげている場合はご容赦ください。Googleで答えを見つけることができませんでした...

私は自分のコードで PyFFTW を使用しています。これには、変換元/変換先の 2 つの変数 (ソース/宛先) を渡す計画段階があります。その後、FFT を呼び出すと、これらの変数が計画段階で配置された正確なメモリ空間で動作します。したがって、これらの 2 つの変数のメモリ内の場所が変わらないように、変数に対して実行されるすべての操作を実行する必要があります。標準の数学演算子に対してこれを行う演算子*=、などを見つけました。+=ただし、私のプログラムでは、関数を変数に適用する必要があり、変数は同じメモリ位置に返されます。これを行う方法?!

最初は次の方法でスライスを使用しました。

a[:] = func(a)[:]

ただし、これは非常に遅いことに気付きました (私のコードは約 10% 遅いです)。では、これについてどうすればよいか知っている人はいますか?

どんな助けでも大歓迎です。前もって感謝します!

4

4 に答える 4

0

ローカル値を使用してグローバル値を参照するのはどうですか。もっと速くなりそうな予感…

global a
a = []
def test(): 
    global a
    b = [1,2,3,4]
    a = b
....

ええと..私もcProfilerでテストする必要があります

于 2011-03-11T04:50:00.167 に答える
0

これはあなたがやろうとしていることですか?

def time10(a):
  """ multiple the elements by 10 in-place """
  for i in xrange(len(a)):
    a[i] *= 10
  # returning a is optional. I think it maybe useful for use to chain the operation
  return a

>>> a = range(10)
>>> time10(a)
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> b = range(10)
>>> time10(time10(b))
[0, 100, 200, 300, 400, 500, 600, 700, 800, 900]
>>> b
[0, 100, 200, 300, 400, 500, 600, 700, 800, 900]
>>>

元のコードは、返された後に配列をコピーします。通常、これは有用な方法ではなく、実行時間が遅くなる原因となります。

于 2011-03-10T18:16:46.083 に答える
0

そのため、結局、問題に対する満足のいく解決策を見つけることができませんでした。私は最初、上記のdelnanによって提案されたソリューションを使用することになりました

a[:] = func(a)[:]

特定のサイズの配列を事前に割り当てます。delnansのコメントを回答として受け入れる方法/可能かどうかわからなかったため、これを私の回答として追加して申し訳ありません...

于 2013-12-31T13:22:07.520 に答える
0

変数は変更可能な型であるため、関数はそれを直接操作できます。

コピーを作成したり、新しい割り当てを作成したりする関数や演算子 (まだ使用できなかったものと同じもの) を使用することはできませんが、関数の引数の直接の変更は、関数。

于 2011-03-10T16:50:16.990 に答える