この記事では、リストよりメモリ効率が良いリストみたいなarrayの使い方を解説します。
文字、整数、浮動小数点数のうち、一種類のオブジェクトしか取り扱わない場合は、リストではなく、arrayモジュールのarray()クラスを使うことでかなりのメモリを節約することができます。
それでは、arrayの使い方を見ていきましょう!
arrayとは?
arrayモジュールのarray()クラスは、文字、整数、浮動小数点数の値を格納できるシーケンス型です。arrayモジュールは、標準ライブラリなのでインポートするだけで使用可能です。
from array import array array(typecode[, initializer])
| typecode引数 | 型コードを指定し、このオブジェクトで取り扱う型を設定します。(後述) |
|---|---|
| initializer引数 | 初期値を指定できるオプション引数。リストやイテレーション可能なオブジェクトを指定する。 |
格納する要素の型を制限することでリストよりもコンパクトに扱うことができます。型の制限があることを除けばリストとまったく同じように使えます。
要するに、文字、整数、浮動小数点数のどれか1種類の型しか扱わない場合に、リストを使うよりもコンパクトに扱えて便利な型ってことです!
arrayの使い方
arrayを生成するにはtypecode引数に型コードを指定する必要があります。型コードはarray内で使用する型を表すコードとなり、以下のようなものが用意されています。
| 型コード | 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を使ってリストと同じようなことをしてみます。
from array import array # アレイ初期化('u' = 文字) a = array('u', ['a', 'b', 'c']) print(a) # 要素の追加 a.append('d') print(a) # 要素の削除 a.remove('b') print(a) # 要素を1つずつ出力 for e in a: print(e)
実行結果
array('u', 'abc') array('u', 'abcd') array('u', 'acd') a c d
型の範囲に注意
指定した型コードの範囲外の値を格納すると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
データ型の範囲ついては、以下の記事が参考になります。
Linkデータ型の範囲 | Microsoft Docs
メモリ消費を比べてみる
リストよりもメモリを節約できてるか、生成したオブジェクトのサイズを確認して比べてみます。
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を使う方が効率的です。ただし、型のサイズには気をつけましょう!
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ


