Categories: Python

【Python】リストより効率が良いリストみたいな配列【array】

この記事では、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

データ型の範囲ついては、以下の記事が参考になります。

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を使う方が効率的です。ただし、型のサイズには気をつけましょう!

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

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Unity】イメージやテキストを等間隔で配置する方法

UnityでイメージやテキストなどのUI…

3日 ago

【Python】フォーマット時の書式の設定

この記事では、Pythonで文字列に値を…

5か月 ago

【Python】変数にデフォルト値を渡す方法

この記事では、変数にデフォルト値を渡す方…

5か月 ago

【Python】明示的に例外(エラー)を発生させる方法

この記事では、Pythonで例外(エラー…

5か月 ago

【C言語】ファイルを読み書きする方法

この記事では、C言語でファイルを読み書き…

6か月 ago