msgspec入門:高速・型安全なシリアライザ
msgspecとは
msgspec とは Python で高速かつ型安全にデータのシリアライズ/デシリアライズとバリデーションを行えるライブラリです。
JSON・MessagePack・YAML・TOMLを扱え、依存ゼロの軽量設計なのが特徴です。私は主に容量の大きい JSON を型安全に読み込みたい時に使用しています。
-
圧倒的な速度:最も注目すべきはその処理速度です。以下の画像からも分かる通り一般的に使用されている pydantic と比較しても非常に高速です。
- 最新のリリースでは JSON エンコードが最大 40 % 速くなりました(参考)
- 型バリデーションも対応:pydantic 等と同様に型の宣言やバリデーションを簡単に行えます。
- 依存ゼロで軽量:外部ライブラリにほとんど頼らないので、環境に入れてもサイズが小さくトラブルが少ないです。
JSON Serialization & Validationの速度比較
他にも様々な側面から既存のライブラリとの比較がされています。さらに詳しい比較はこちら → Benchmarks
基本的な使い方
まずはインストール。今回は uv を例にします。uv のおすすめ記事はこちら
uv add msgspec
モデル(Struct)の定義
msgspec.Struct
を使ってモデルを定義します。以下のように dataclass や pydantic と同様の書き方で書けます。
import msgspec
class User(msgspec.Struct):
id: int
name: str
email: str | None = None
frozen=True
にすることで、インスタンスをimmutableにすることもできます。
class Point(msgspec.Struct, frozen=True):
x: int
y: int
p = Point(1, 2)
p.x = 3 # エラー: 属性の再代入はできない
他にも便利なオプションがあります。詳細は公式ドキュメントをご確認ください。
エンコード(Python → JSON)
モデルインスタンスをJSONに変換するにはmsgspec.json.encode(instance)
を使用します。
alice = User(1, "Alice", "alice@example.com")
json_bytes = msgspec.json.encode(alice)
デコード(JSON → Python)
特に大きなJSONを読み込むときに便利です。型を指定してデコードできます。
以下のようにtype=User
を渡すだけで 型アノテーションをしてくれます。型が一致しない場合は msgspec.ValidationError
が発生します。
decoded = msgspec.json.decode(json_bytes, type=User)
# -> User(id=1, name='Alice', email='alice@example.com')
ファイルからJSONを読み込む場合は以下のように記述します。
from pathlib import Path
import msgspec
data = Path("/path/to/users.json").read_bytes()
users: list[User] = msgspec.json.decode(data, type=list[User])
まとめ
本記事では msgspec の基本的な使い方を紹介しました。詳細や他の機能について知りたい方は公式ドキュメントをご確認ください(今後記事を書くかもしれません)。
私は主に「重い JSON を型安全に処理したい」ケースで使用しています。ただし、機能が豊富な pydantic を使う場面も多いため、用途によって使い分けています。
重たい JSON に出会ったら、ぜひ msgspec を思い出して使ってみてください。
Discussion