今回は、Pythonで辞書のサイズを求める方法について紹介します。
辞書のサイズとは、その長さ、つまりメモリ上に占める空間のことです。
辞書に格納されている要素の数を求めるには、 len()
関数を使用します。
辞書のサイズをバイト単位で求めるには、 sys
モジュールの getsizeof()
関数を使用します。
ネストした辞書の要素を数えるには、再帰的な関数を使用することができます。
辞書の大きさを求める
Pythonでは、オブジェクトの大きさを調べるのに len()
関数がよく使われます。
この例では、辞書オブジェクトをこの関数に渡すと、辞書のサイズ、つまり、辞書に存在するキーと値のペアの数が返されます。
これらのオブジェクトはその長さを追跡しているので、この操作の時間複雑度はO(1)です。
my_dict = {1: "a", 2: "b"}
print("The length of the dictionary is {}".format(len(my_dict)))
上記のスニペットはこのような出力を返します。
The length of the dictionary is 2
辞書のサイズをバイト単位で求める
辞書オブジェクトのメモリサイズ (バイト単位) は getsizeof()
関数によって求めることができる。
この関数は sys
モジュールから利用可能です。
len()` と同様に、任意の Python オブジェクトのサイズを見つけるために使用することができます。
これは特に、パフォーマンスが必要なコードや、定期的な監視が必要なコードで役に立ちます。
前の例で、辞書の要素数の代わりにバイト数でサイズを取得してみましょう。
import sys
my_dict = {1: "a", 2: "b"}
print("The size of the dictionary is {} bytes".format(sys.getsizeof(my_dict)))
結果の出力は次のようになります。
The size of the dictionary is 232 bytes
ネストした辞書のサイズを調べる
ネストされた辞書とは、辞書の中の辞書、または複数レベルのキーと値のペアを持つ辞書のことです。
このネストされた辞書は、APIからのJSONレスポンスのような複雑な構造を簡素化するのに役立ちます。
これらは、次のようなものである。
{"dict1": {"dict2": "value 1"}}
すべてのキーと値のペアの数を得るために len()
を使用すると、最初のレベルのキーのオブジェクトのサイズのみを与えるため、うまくいきません。
ネストされたすべてのキーの数を求めるには、キーを数えるためのカスタム再帰関数を書けばよいのです。
この関数は、辞書とカウンターを引数にとり、各キーに対して反復処理を行います。
反復処理ごとに、この関数は対象となるキーのインスタンスが辞書であるかどうかをチェックします。
もしそれが本当なら、カウンタ変数に counter+1
を追加し、評価中の辞書を引数として渡して、この関数が再帰的に再度呼び出されます。
この再帰的な関数は、繰り返しが完了した時点で終了し、辞書の長さを変数として返します。
変数 counter
として返す。
キーが辞書のインスタンスでない場合、カウンタは単に counter+1
に追加される。
この関数は、反復処理の結果として counter
という値を返し、これが評価中の辞書のサイズとなります。
したがって、ネストされたキーのカウントは、以下のようにこの関数を用いて評価される。
def count_keys(dict_, counter=0):
for each_key in dict_:
if isinstance(dict_[each_key], dict):
# Recursive call
counter = count_keys(dict_[each_key], counter + 1)
else:
counter += 1
return counter
my_dict = {
'Name':
{
'first_name': 'Sherlock',
'Last_name': 'Holmes'
},
'Locality':
{
'Address':
{
'Street': '221B Baker Street'
},
'City': 'London',
'Country': 'United Kingdom'
}
}
print('The length of the nested dictionary is {}'.format(count_keys(my_dict)))
そして、このスニペットが実行されると、辞書に存在するキーの数に対応する以下のような出力が得られます。
The length of the nested dictionary is 8
結論
この記事では、辞書とネストされた辞書のサイズと長さを計算する方法について検討しました。
これらの関数は、API上でJSONオブジェクトを提供する際に非常に役立ちます。
WebサーバーがAPI上で提供するJSONオブジェクトのサイズには制限があり、これらの関数を使用して長さとサイズをチェックすることが可能です。