💨

msgspec入門:高速・型安全なシリアライザ

に公開

msgspecとは

msgspec とは Python で高速かつ型安全にデータのシリアライズ/デシリアライズとバリデーションを行えるライブラリです。
JSON・MessagePack・YAML・TOMLを扱え、依存ゼロの軽量設計なのが特徴です。私は主に容量の大きい JSON を型安全に読み込みたい時に使用しています。

  • 圧倒的な速度:最も注目すべきはその処理速度です。以下の画像からも分かる通り一般的に使用されている pydantic と比較しても非常に高速です。
    • 最新のリリースでは JSON エンコードが最大 40 % 速くなりました(参考
  • 型バリデーションも対応:pydantic 等と同様に型の宣言やバリデーションを簡単に行えます。
  • 依存ゼロで軽量:外部ライブラリにほとんど頼らないので、環境に入れてもサイズが小さくトラブルが少ないです。

json-speed
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