1次元配列を作成している場合は、それをリストとして実装するか、標準ライブラリの 'array'モジュールを使用します。私は常に1次元配列にリストを使ってきました。
代わりに配列モジュールを使いたい理由や状況は何ですか?
それはパフォーマンスとメモリの最適化のためのものですか、それとも私は明らかな何かを見逃していますか?
基本的に、Pythonリストは非常に柔軟で、完全に異種の任意のデータを保持できます。また、 償却された一定時間 で非常に効率的に追加できます。手間をかけずにリストを時間効率よく縮小および拡大する必要がある場合は、それらが最適な方法です。しかし、彼らはをCの配列よりもずっと多くのスペースを使っています。
一方、array.array
型は、C配列の単なるラッパーです。同種のデータ、すべて同じタイプのデータしか保持できないため、sizeof(one object) * length
バイトのメモリしか使用しません。ほとんどの場合、Cの配列をエクステンションまたはシステムコールに公開する必要があるときに使用する必要があります(ioctl
やfctnl
など)。
array.array
は、Python 2.xで可変文字列を表現するための合理的な方法でもあります(array('B', bytes)
)。しかし、Python 2.6以降と3.xでは可変のbyte文字列が bytearray
として提供されています。
ただし、同種の数値データ配列に対して数学を実行したい場合は、NumPyを使用するほうが賢明です。これにより、複雑な多次元配列に対する操作を自動的にベクトル化できます。
長い話を短くする:array.array
は、数学以外のもののために同種のCのデータ配列が必要なときに便利です。
ほとんどの場合、通常のリストが正しい選択です。配列モジュールはC配列の細かいラッパーに似ています。これにより、厳密に型指定されたコンテナのようなものになります( docs を参照)。 signed/unsigned shortやdoubleなどの型のように、これらは組み込み型の一部ではありません。本当に必要なときだけ、arrayモジュールを使うといいでしょう。それ以外の場合は、リストを使い続けます。
配列モジュールは、それを使用する理由がわからない場合はおそらく必要ないと思われる種類のものの1つです(そして、私はこれを侮辱的な言い方で言うつもりはないことに注意してください)。 。ほとんどの場合、配列モジュールはCコードとのインターフェースに使用されます。あなたのパフォーマンスについてのあなたの質問にもっと直接的な答えを与えるために:
いくつかの用途では、配列はリストよりも効率的です。変更しないアレイを割り当てる必要がある場合は、アレイの方が速く、使用するメモリも少なくて済みます。 GvRには 最適化の逸話 があります。ここでは、配列モジュールが勝者になります(長い間読みますが、それだけの価値があります)。
一方、リストが配列よりも多くのメモリを消費するのは、割り当てられたすべての要素が使用されたときにpythonがいくつかの余分な要素を割り当てるためです。これは、リストへのアイテムの追加が速いことを意味します。あなたがアイテムを追加することを計画しているのであれば、リストが進むべき道です。
TL; DR非常に優れた最適化が必要な場合、またはCコードとのインタフェースが必要な場合にのみ配列を使用します( pyrex は使用できません) ).
それはトレードオフです!
それぞれの長所:
私の理解するところでは、配列はより効率的に(つまり、連続したメモリのブロック対Pythonオブジェクトへのポインタとして)格納されますが、パフォーマンス上の利点はありません。さらに、配列では同じ型のプリミティブを格納する必要がありますが、リストには何でも格納できます。
標準ライブラリ配列は、intのリストを文字列に変換してwaveファイルなどに書き込むなど、バイナリI/Oに役立ちます。それは言った、多くの人がすでに指摘したように、もしあなたが何か実際の仕事をするつもりならば、あなたはNumPyの使用を検討すべきです。
配列は特定の型にのみ使用できますが、リストは任意のオブジェクトに使用できます。
配列には1つのタイプのデータしかありませんが、リストにはさまざまなオブジェクトタイプのエントリを含めることができます。
いくつかの数値計算では配列もより効率的です。
もしあなたが配列を使うつもりなら、numpyやscipyパッケージを検討してください。
Numpy配列とlistの重要な違いは、配列スライスが元の配列のビューであるということです。つまり、データはコピーされず、ビューに対する変更はソース配列に反映されます。