この記事では、Pythonのリストより効率が良いリストみたいな配列の使い方を解説します。
文字、整数、浮動小数点数のうち、一種類のオブジェクトしか取り扱わない場合は、リストではなく、array
モジュールのarray()
クラスを使うことでかなりのメモリを節約することができます。
arrayの使い方
array
モジュールのarray()
クラスは、文字、整数、浮動小数点数の値を格納できるシーケンス型です。array
モジュールは、標準ライブラリなのでインポートするだけで使用可能です。
import array
array.array(typecode[, initializer])
typecode引数 | 型コードを指定し、このオブジェクトで取り扱う型を設定します。(後述) |
---|---|
initializer引数 | 初期値を指定できるオプション引数。リストやイテレーション可能なオブジェクトを指定する。 |
格納する要素の型を制限することでリストよりもコンパクトに扱うことができます。型の制限があることを除けばリストとまったく同じように使えます。
要するに、文字、整数、浮動小数点数のどれか1種類の型しか扱わない場合に、リストを使うよりもコンパクトに扱えて便利な型ってことです!
型コード一覧
型コードには、以下が定義されています。
型コード | Cの型 | Pythonの型 | 最小サイズ(バイト) |
---|---|---|---|
'b' | signed char | int | 1 |
'B' | unsigned char | int | 1 |
'u' | wchar_t | Unicode文字 | 2 |
'h' | signed short | int | 2 |
'H' | unsigned short | int | 2 |
'i' | signed int | int | 2 |
'I' (大文字のi) | unsigned int | int | 2 |
'l' (小文字のL) | signed long | int | 4 |
'L' | unsigned long | int | 4 |
'q' | signed long long | int | 8 |
'Q' | unsigned long long | int | 8 |
'f' | float | float | 4 |
'd' | double | float | 8 |
サンプル
試しに、array
を使ってリストと同じようなことをしてみます。
import array
# 型コード 'H' で生成
values = array.array('H', [1, 2])
# 要素追加
values.append(101)
# 要素削除
values.remove(2)
# for文で出力
for value in values:
print(value)
実行結果
1
101
型の範囲に注意
指定した型コードの範囲外の値を格納するとOverflowError
が発生します。
import array
values = array.array('b')
# 範囲外の要素追加
values.append(128)
実行結果
Traceback (most recent call last):
File "main.py", line 7, in
values.append(128)
OverflowError: signed char is greater than maximum
データ型の範囲ついては、以下の記事が参考になります。
メモリ消費を比べてみる
リストよりもメモリを節約して扱えてるか生成したオブジェクトのサイズを確認して比べてみます。
import array
# 型モード 'i'
a = array.array('i', [1, 2, 3])
# メモリ消費量の出力
print(f"型モード 'i': {a.__sizeof__()}")
# 型モード 'b'
a = array.array('b', [1, 2, 3])
# メモリ消費量の出力
print(f"型モード 'b': {a.__sizeof__()}")
# リスト
l = [1, 2, 3]
# メモリ消費量の出力
print(f"リスト: {l.__sizeof__()}")
実行結果
型モード 'i': 76
型モード 'b': 67
リスト: 104
かなりメモリが節約できていることがわかりました。指定した型モードによっても差が生じるので適切なサイズの型モードを指定しましょう!

まとめ
この記事では、リストより効率の良いarray
について解説しました。
1種類の型の要素しか格納しない場合は、リストよりもarray
を使う方が効率的です。ただし、型のサイズには気をつけましょう!
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ