この記事では、Pythonのリストより効率が良いリストみたいな配列の使い方を解説します。
文字、整数、浮動小数点数のうち、一種類のオブジェクトしか取り扱わない場合は、リストではなく、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
データ型の範囲ついては、以下の記事が参考になります。
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を使う方が効率的です。ただし、型のサイズには気をつけましょう!
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ