9.1 固定サイズの配列の特徴
固定サイズの配列ってのは、作成時にサイズが決まっててプログラム実行中に変更できない配列のこと。Pythonで固定サイズの配列を作るには、ライブラリarray
を使うか、リストを使うことができるんだ。ただし、Pythonのリストはサイズを変更できちゃうから、他の言語の配列みたいに使うことが多い。
固定サイズの配列の特徴:
- 固定サイズ: 配列のサイズは作成時に決まって、その後は変更できない。
- 均一性: 配列の全ての要素は同じタイプでなきゃだめ。
- 素早いインデックスアクセス: 配列の要素へのアクセスは一定時間、つまり
O(1)
でできる。 - サイズ変更不可: 配列の要素の数は変わらなくて、新しい要素を追加することはできない。
Pythonで固定サイズの配列を作成する例:
array
ライブラリを使う場合:
import array
# 整数の配列を作成する(型 'i' は int)
arr = array.array('i', [1, 2, 3, 4, 5])
# 要素へのアクセス
print(arr[2]) # 出力: 3
# 要素の値を変更
arr[2] = 10
print(arr) # 出力: array('i', [1, 2, 10, 4, 5])
リストを使用して(固定サイズの配列を模倣):
# 固定サイズのリストを作成
arr = [0] * 5
# 要素の初期化
arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
arr[4] = 5
# 要素へのアクセス
print(arr[2]) # 出力: 3
# 要素の値を変更
arr[2] = 10
print(arr) # 出力: [1, 2, 10, 4, 5]
9.2 固定サイズの配列の利点と欠点
全てには利点と欠点があるよね。固定サイズの配列の場合もそうなんだ。
利点:
- 素早いインデックスアクセス: 配列のどんな要素へのアクセスも一定時間でできちゃうから、読み取りにすごく効率的。
- シンプルな実装: 配列は理解しやすく使いやすい。色んなタスクで簡単に実装できるし適用できる。
- メモリの効率的な使用: 配列のサイズは固定だから、作成時にメモリが確保されて、メモリの再割り当ての負担を避けられる。
- 予測可能性: 固定サイズの配列はメモリ管理とリソースの使用の予測を簡単にしてくれる。
欠点:
- サイズ変更不可: 配列のサイズは作成時に決まって変更できない。つまり、必要なサイズを最初から知っておくか、メモリの過剰割り当てをリスク取る必要があるってこと。
- 挿入と削除のコスト: 要素の挿入や削除は時間がかかるかも。要素をシフトする必要があるからね。最悪の場合、配列の中央で挿入や削除を行うのに
O(n)
の時間がかかる。 - メモリの非効率的な使用: 配列が完全に使われていない場合、空のメモリセルは未使用のままになる可能性があり、メモリ使用が非効率になる。
- 限定された柔軟性: 配列はサイズを動的に変更できないから、リストのような動的データ構造と比べると柔軟性が少ない。
9.3 使用例と応用例
ここに固定サイズの配列の使用例と応用例をいくつか紹介するよ。
例1: テーブルと行列
固定サイズの配列は、あらかじめサイズが分かっているテーブルや行列の表現によく使われるんだ。
import numpy as np
# 固定サイズの3x3行列を作成
matrix = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
# 行列の要素へのアクセス
print(matrix[1][2]) # 出力: 6
# 行列の要素を変更
matrix[1][2] = 10
print(matrix)
# 出力:
# [[ 1 2 3]
# [ 4 5 10]
# [ 7 8 9]]
例2: バッファとキャッシュ
固定サイズの配列は、あらかじめサイズが分かって変更されないバッファやキャッシュの作成に使われるんだ。
# データを読み込むための固定サイズのバッファ
buffer_size = 1024
buffer = bytearray(buffer_size)
# バッファにデータを入れる
data = b"Hello, World!"
buffer[:len(data)] = data
print(buffer[:len(data)]) # 出力: b'Hello, World!'
例3: 時間と日付のデータ保持
固定サイズの配列は、各月の日数みたいな時間と日付のデータを保持するのに使われるんだ。
この例では、list
クラスを使って固定サイズの配列の振る舞いをエミュレートしてみるね:
# 各月の日数(閏年じゃない)
days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# データへのアクセス
month = 2 # 2月
print(f"2月には{days_in_month[month - 1]}日があります") # 出力: 2月には28日があります
GO TO FULL VERSION