2017-07-26 3 views
0

私はループ内で配列をcdefできないことを理解しています。ループの前に配列をcdefする必要があります。ループ内でループの外側で初期化した配列を設定すると、繰り返しごとにサイズが大きく変わることはありますか? Aのサイズが反復から反復に大きく異なりますcdefループ内のサイズを変更するcythonの配列ですが、メモリの問題はありますか?

cdef int i 
cdef int [:] A 
for i in range(100): 
    A = np.zeros(np.random.randint(10, 1000), dtype=np.int32) 

はこのようなものを想像してみてください。これはどんな種類の記憶にもつながりますか?誰かが私がループを辿っている間、何がメモリ内で正確に起こっているのかを説明できますか?これに問題がある場合は、選択肢がありますか?ありがとう

+0

私は、呼び出し元に、このループを置くことをお勧めしたいですPythonコード、そして2次元 'A'配列を使ってCython関数を呼び出すことです。 「A」を処理するときに速度を上げることに焦点を当てる。このように 'A'を作成しても、Cythonのコンパイルは利用されません。 – hpaulj

答えて

1

いいえ問題:memoryviewsは通常のPythonオブジェクトのようにカウントされるので、新しい配列がAに割り当てられると、古いものの参照カウントは0になり、解放されます。

唯一の例外は、Pythonオブジェクトではなくポインタからメモリビューを作成する場合です。この場合、メモリを処理する必要があります。それはここには当てはまりません。

(@hpauljコメントで言うように、これはCythonから任意のスピードアップを取得することはありませんが、私はあなたの本当のコードがループ内でもう少し作業を行うと仮定)

関連する問題