Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

Pythonのcollections.deque

Pythonのリスト処理を高速かつ安全にできるcollectionsモジュールのdequeの使い方の解説

Pythonのリストの高性能版、collectionsモジュールが提供するdequeの解説

Pythonには最初から使いやすく便利なリストという型が用意されていますが、そのリストの性能をさらに拡張した、いわばリストの上位互換(?)の特別な型がモジュールによって用意されています。そのモジュールとは以前も紹介したcollectionsモジュールです。

これらの過去記事で紹介したCounterサブクラスやnamedtuple関数だけでなく、collectionsモジュールにはとても便利な機能が他にもあります。今回はそのうちの1つ、deque(デック)という特別な型を紹介します。

Pythonのcollections.dequeについて

定義

Python公式ドキュメントによると、collections.dequeとは、次のような型(クラス)として定義されています。

class collections.deque([iterable[, maxlen]])

仮引数のiterableと書かれている部分は、イテラブルオブジェクトを指定します。たとえばリストとかですね。このイテラブルオブジェクトとイテレータオブジェクトの関係がどのようなものかについては、記事「【初心者にもわかりやすく】Pythonのイテレータについて、その基本とfor文の仕組みを解説」をご覧ください。

Pythonでは上のようにクラスを宣言・定義することは基本的に新しい型を作成することにもなります。よって、このcollections.dequeというクラスによって、同じ名前の型が定義されたことにもなります。

collections.dequeのメリット

このリストなどの上位互換というイメージのcollections.dequeですが、そのメリットとして公式ドキュメントには次のように書かれています。

Deque とは、スタックとキューを一般化したものです (この名前は「デック」と発音され、これは「double-ended queue」の省略形です)。Deque はどちらの側からも append と pop が可能で、スレッドセーフでメモリ効率がよく、どちらの方向からもおよそ O(1) のパフォーマンスで実行できます。

つまり、

  • メモリをあまり消費しない
  • 処理速度が速い

ということで、リストなどなんらかの集合であるオブジェクトをいじる場合には、そうした最初から用意されているものを使うよりも高性能だということですね。

使い方

実際の使い方は以下のようにインポートしてから、通常のクラスを使うようにインスタンスオブジェクト(以下、単にインスタンス)の作成、それへの代入という手順となります。そのようにして作られたインスタンスを今回は便宜上デックオブジェクトと呼ぶことにします。

上述のように引数(実引数)にはイテラブルオブジェクトを指定しましょう。しなかった場合は空のデックオブジェクトが作成されます。

import collections
deq = collections.deque(イテラブルオブジェクト)

用意されているメソッド一覧

このcollections.dequeクラスには次のようなメソッドが用意されています。公式ドキュメントの内容をそのまま表にします。

append(x)x を deque の右側につけ加えます。
appendleft(x)x を deque の左側につけ加えます。
clear()deque からすべての要素を削除し、長さを 0 にします。
copy()deque の浅いコピーを作成します。
count(x)deque の x に等しい要素を数え上げます。
extend(iterable)イテラブルな引数 iterable から得られる要素を deque の右側に追加し拡張します。
extendleft(iterable)イテラブルな引数 iterable から得られる要素を deque の左側に追加し拡張します。注意: 左から追加した結果は、イテラブルな引数の順序とは逆になります。
index(x[, start[, stop]])deque 内の x の位置を返します (インデックス start からインデックス stop の両端を含む範囲で)。最初のマッチを返すか、見つからない場合には ValueError を発生させます。
insert(i, x)x を deque の位置 i に挿入します。挿入によって、長さに制限のある deque の長さが maxlen を超える場合、IndexError が発生します。
pop()deque の右側から要素をひとつ削除し、その要素を返します。要素がひとつも存在しない場合は IndexError を発生させます。
popleft()deque の左側から要素をひとつ削除し、その要素を返します。要素がひとつも存在しない場合は IndexError を発生させます。
remove(value)value の最初に現れるものを削除します。要素が見付からないない場合は ValueError を送出します。
reverse()deque の要素をインプレースに反転し、None を返します。
rotate(n=1)deque の要素を全体で n ステップだけ右にローテートします。n が負の値の場合は、左にローテートします。
deque が空でないときは、 deque をひとつ右にローテートすることは d.appendleft(d.pop()) と同じで、 deque をひとつ左にローテートすることは d.append(d.popleft()) と同じです。
maxlendeque の最大長で、制限されていなければ None です。

以下、実際にこれらのメソッドを使った例を見ていきましょう。

使用例

ではcollections.dequeに用意されているメソッドをいくつか使ってみましょう。

最初に上述のようにインポートして、インスタンス作成などの作業をします。

import collections

#イテラブルオブジェクトの1種であるリストを作成
companies = ["Google", "Apple", "Amazon"]

# イテラブルオブジェクトを指定してインスタンス作成
deq = collections.deque(companies)

# 型確認。結果:<class 'collections.deque'>
type(deq) 

# クラス定義したので型アノテーションが使える
deq:collections.deque

この出来上がったデックオブジェクトは、__len__メソッドをもっています。それゆえ、len()で長さを取得できます。実際に、

len(deq)

結果は、

3

です。

また、デックオブジェクトはイテラブルですので、for文などといっしょに使うことが可能です。たとえば、


for i in deq:
    print(i)

結果は、

Google
Apple
Amazon

となります。

それではいよいよメソッドのappend(デックオブジェクトの最後に要素を追加)を使ってみます。


#リスト末に追加
deq.append("Microsoft")
print(deq)

結果は、

deque(['Google', 'Apple', 'Amazon', 'Microsoft'])

通常のリスト表記ではなく、deque(~)という表現になっていますね。

次に、appendleft(デックオブジェクトの頭に要素を追加)を使ってみます。

#リスト頭に追加
deq.appendleft("Meta")
print(deq)

結果は、

deque(['Meta', 'Google', 'Apple', 'Amazon', 'Microsoft'])

続いて、popメソッドです。

#リスト末を削除し、その削除された要素そのものを返す
deq.pop() 

結果は、

'Microsoft'

最後に、rotateメソッドです。これは引数の数字分だけ→側に順番をズラすメソッドです。今回は1つだけ→へ順番をズラしましょう。

deq.rotate(1)
print(deq)  

結果は、

deque(['Amazon', 'Meta', 'Google', 'Apple'])

となり、順番が1つずつズレているのがわかります。そしてもともとは一番最後だったAmazonが一番最初に移動しています。ローテーションしているわけですね。

以上のように、collections.dequeを使うとこういった処理が通常のリストなどよりも簡単に、そして高速に安全に出来るというわけですね。

おそらく現実の実務でもcollectionsはどんどん使って良いもの(たぶん)だと思うので、ぜひ慣れておきたいですね。

Pythonをプロから短期間で合理的にマスターするなら、やはり動画による学習方法がわかりやすくオススメです。世界最大級のオンライン学習サイトUdemy(ユーデミー)【PR】ではPythonのプログラミング講座が入門~応用レベルまで幅広く展開されています。

Udemyの動画講座では講師に質問が可能、動画なのでプログラムの動きがわかりやすく理解しやすい、わかりにくいところを何度も繰り返し再生できる、プログラミングスクールよりもはるかに安いというメリットがあります。

その中でも次のような講座がおすすめです。

他にも多数のプログラミング講座があるのでぜひ活用し、合理的に短期間でプログラミングを身に着けましょう。

愛を分かち合いましょう