numpy配列のメモリはドキュメントに詳しく記述されています。リストメモリのレイアウトも議論されていますが、通常numpyとは対照的です。
numpy配列には、固定サイズのデータバッファがあります。 「成長」するには、新しい配列を作成し、それにデータをコピーする必要があります。 np.concatenate
これはコンパイルされたコードで行います。 np.append
および全てのstack
機能はconcatenate
を使用しています。
リストは、私が理解するように、オブジェクトへのポインタを含む連続したデータバッファです。 Pythonはそのバッファに空き領域をいくつか保持しているので、list.append
の追加は比較的高速で簡単です。しかし、フリースペースがいっぱいになると、新しいバッファーとコピーポインターを作成する必要があります。私はそれが大きなリストで高価になる可能性がある場所を見ることができます。
リストには、各要素のポインタと要素自体(たとえばフロート)がメモリ内のどこかに格納されます。対照的に、浮動小数点数の配列は、浮動小数点数そのものを連続したバイトとしてバッファに格納します。 (オブジェクトのdtype配列はもっとリストに似ています)。
アレイを繰り返し作成するには、append
でリストを作成し、最後に1回作成することをお勧めします。繰り返されるnp.append
またはnp.concatenate
は、比較的高価です。
deque
が挙げられた。私はデータがどのように保存されているかはよく分かりません。ドキュメントでは、開始時と同じくらい簡単に要素を追加できますが、ランダムアクセスはリストよりも遅いと言います。これは、何らかのリンクリストにデータを格納することを意味し、nth
要素を見つけるには、その前にn-1
リンクを横断する必要があります。したがって、成長の容易さとアクセス速度との間にはトレードオフがあります。
リストの先頭に要素を追加するには、新しいポインタのリストを新規に作成する必要があります。したがって、通常のリストの開始から要素を追加したり削除したりすることは、最後に行うよりもはるかに高価です。
推奨ソフトウェアはコアSOの目的外です。他は提案をするかもしれませんが、これが閉鎖されれば驚くことはありません。
大きなデータセット用に設計されたHDF5
のようなファイル形式があります。彼らは「チャンク」のような機能で成長に対応します。そして、あらゆる種類のデータベースパッケージがあります。
配列(https://docs.python.org/2/library/array.html)を意味しますか?またはリスト?これらはPythonの2つの異なるものですから。配列はPythonで遅くなります。 – MooingRawr
(ちょっとした考えです):CPythonのリスト/ arraylistの動作はstd :: vectorと似ていると思いますが、C++で使用できる手動制御はありません。私は、あなたのユースケース(特にnp.appendは非常に一般的な操作ではないはずです)で、アルゴリズム側ではるかに多くの可能性があると想像することができます。そうでなければ、いつでも[cython](http://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html)でいくつかのstd :: vectorラッパーを構築することができます。私はまた、リンクリストベースのデータ+配列変換を2段階で成長させるプロセスが好きなので、blue_noteのdequeについて言及したいと思います。 – sascha
@MooingRawr私がこれに関連する理由は、メモリ内で連続している必要はなく、それでも大きな配列では遅いからです。だから私は正直に何が起こっているのか分からない。 –