Python PR

【Python】リストよりメモリ効率が良いリストみたいなarrayの使い方

記事内に商品プロモーションを含む場合があります

この記事では、リストよりメモリ効率が良いリストみたいな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

かなりメモリが節約できていることがわかりました。指定した型モードによっても差が生じるので適切なサイズの型モードを指定しましょう!

【Python】オブジェクトのサイズ(メモリ消費量)を確認するこの記事では、Python でオブジェクトのサイズ(メモリ消費量)を確認する方法を解説します。オブジェクトのサイズを確認することでどの程度メモリを使っているのか知ることができます。それでは、オブジェクトのサイズを確認する方法を見ていきましょう!...

まとめ

この記事では、リストよりメモリ効率の良いarrayについて解説しました。

1種類の型の要素しか格納しない場合は、リストよりもarrayを使う方が効率的です。ただし、型のサイズには気をつけましょう!

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ