インメモリデータ構造

Python は標準的なプログラミングのデータ構造を 組み込み型 (リスト、タプル、ディクショナリ、集合) として提供します。ほとんどのアプリケーションではそれ以上のデータ構造は必要ないですが、必要になったとき標準ライブラリが提供してくれます。

配列

大量データの用途には list ではなく array を使用した方が効率が良くなるかもしれません。array は1つのデータ型のみに制限されるので、汎用目的のリストよりもメモリ表現が小さくなります。この利点に加えて、array はリストとほとんど同じメソッドで操作できます。そのため、アプリケーションに大きな変更なく、リストから array に置き換えられる可能性があります。

ソート

値を追加したり削除したりするときにソートされたリストを保持する必要があるときは heapq を調べてみてください。リストから要素を追加したり、削除したりするのに heapq の関数を使用することで、低いオーバーヘッドでリストの順番を保持できます。

ソートされたリストや array を作成する別の選択肢として bisect があります。 bisect は、新しい要素の挿入位置を2分探索で探すことで、変更する毎にリストのソートを繰り返すことの代替方法になります。

キュー

組み込み型のリストは insert()pop() メソッドでキューを模倣できますが、それはスレッドセーフではありません。スレッド間で本当の実行順序を保持するために Queue を使用してください。 multiprocessing は、モジュール間で簡単にやり取りできるようにプロセス間で動作するキューを提供します。

コレクション

collections はその他のモジュールで見られる拡張データ構造の実装を提供します。例えば、Deque はどちらかの端からも要素を追加したり削除したりできる両端キューです。 defaultdict は、キーが存在しないときにデフォルト値を返すディクショナリです。 namedtuple は、数値インデックスに加えて属性名で要素のメンバーへアクセスできるようにタプルを拡張したものです。

データのデコード

別のアプリケーションとデータを連携する場合、バイナリファイルまたはデータストリームで入力されるかもしれません。 struct は、Python のネイティブ型にデータをデコードすることで簡単に操作させる便利なモジュールです。

カスタムデータ型

最後に、目的にあう型がなかった場合、カスタマイズするためにネイティブ型の1つをサブクラス化して定義すると良いかもしれません。また collections で定義されている抽象ベースクラスで一から定義することもできます。

Bookmark and Share