この記事では、リストよりメモリ効率が良いリストみたいなarrayの使い方を解説します。
文字、整数、浮動小数点数のうち、一種類のオブジェクトしか取り扱わない場合は、リストではなく、array
モジュールのarray()
クラスを使うことでかなりのメモリを節約することができます。
それでは、array
の使い方を見ていきましょう!
array
モジュールのarray()
クラスは、文字、整数、浮動小数点数の値を格納できるシーケンス型です。array
モジュールは、標準ライブラリなのでインポートするだけで使用可能です。
from array import array
array(typecode[, initializer])
typecode引数 | 型コードを指定し、このオブジェクトで取り扱う型を設定します。(後述) |
---|---|
initializer引数 | 初期値を指定できるオプション引数。リストやイテレーション可能なオブジェクトを指定する。 |
格納する要素の型を制限することでリストよりもコンパクトに扱うことができます。型の制限があることを除けばリストとまったく同じように使えます。
要するに、文字、整数、浮動小数点数のどれか1種類の型しか扱わない場合に、リストを使うよりもコンパクトに扱えて便利な型ってことです!
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
データ型の範囲ついては、以下の記事が参考になります。
リストよりもメモリを節約できてるか、生成したオブジェクトのサイズを確認して比べてみます。
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
を使う方が効率的です。ただし、型のサイズには気をつけましょう!
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ
View Comments