2016-12-09 5 views
5

私はlist.append()関数を使用して私に必要な多くのことを行いました。またnumpy配列のためにはnumpy.append()関数も使用しました。私はの両方がの配列のサイズが大きいときに本当に遅くなることに気づいた。numpyの配列とpythonリストは動的に成長するように最適化されていますか?

約100万の要素のサイズに対して動的に成長する配列が必要です。 std::vectorがC++で作られたのと同じように、外部からアクセスできないバッファ長(予備の長さ)を追加することで、これを自分で実装できます。しかし、私は車輪を再発明する必要がありますか?私はそれがどこかに実装されるべきだと思います。だから私の質問です:このようなことは既にPythonに存在するのでしょうか?

意味: Pythonには、ほとんどの場合、時間の複雑さが動的に増加する配列タイプがありますか?

+0

配列(https://docs.python.org/2/library/array.html)を意味しますか?またはリスト?これらはPythonの2つの異なるものですから。配列はPythonで遅くなります。 – MooingRawr

+1

(ちょっとした考えです):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

+0

@MooingRawr私がこれに関連する理由は、メモリ内で連続している必要はなく、それでも大きな配列では遅いからです。だから私は正直に何が起こっているのか分からない。 –

答えて

1

どちらも基礎となる配列を使用します。代わりに、collections.dequeを使用して、両端の要素をO(1)の複雑さで具体的に追加したり削除したりすることができます。

0

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のようなファイル形式があります。彼らは「チャンク」のような機能で成長に対応します。そして、あらゆる種類のデータベースパッケージがあります。

+0

申し訳ありませんが、これはソフトウェアの推奨事項ではなく、ソフトウェアの推奨方法を提案する場合は、SOの記事の99%をクローズする必要があります。私は情報提供に感謝しますが、その文章は非常に非構造的で刺激的であり、ストローマンです。削除してください。 –

+0

同じプロジェクトでHDF5を使用していますが、私はファイルではなくメモリ上のものについて話しています。 –

+0

データをどのように使用するかは、データの成長方法と同じくらい重要です。通常は何度も使用しますが、一度しか成長させません。私はリストを使用して、小さな部分(一度に数値/行)から配列を作成し、大きい配列に結合するために配列を連結するために傾けたいと思います。 – hpaulj

関連する問題