Skip to content

Instantly share code, notes, and snippets.

@MtkN1
Created February 26, 2025 06:18
Show Gist options
  • Save MtkN1/04fa1f4f591e9a7ba6916b4036d7393f to your computer and use it in GitHub Desktop.
Save MtkN1/04fa1f4f591e9a7ba6916b4036d7393f to your computer and use it in GitHub Desktop.
Pydantic vs cattrs Deserialization Benchmark
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from attrs import define, field\n",
"from cattrs.gen import make_dict_structure_fn, make_dict_unstructure_fn, override\n",
"from cattrs.preconf.orjson import make_converter\n",
"from pydantic import ConfigDict, Field, TypeAdapter\n",
"from pydantic.dataclasses import dataclass\n",
"\n",
"\n",
"# attrs/cattrs\n",
"@define\n",
"class UserAttrs:\n",
" name: str = field(metadata={\"rename\": \"userName\"})\n",
"\n",
"\n",
"converter = make_converter()\n",
"unst_hook = make_dict_unstructure_fn(\n",
" UserAttrs, converter, name=override(rename=\"userName\")\n",
")\n",
"st_hook = make_dict_structure_fn(UserAttrs, converter, name=override(rename=\"userName\"))\n",
"converter.register_unstructure_hook(UserAttrs, unst_hook)\n",
"converter.register_structure_hook(UserAttrs, st_hook)\n",
"\n",
"# pydantic\n",
"@dataclass(config=ConfigDict(populate_by_name=True))\n",
"class UserPydanticDataclass:\n",
" name: str = Field(validation_alias=\"userName\", serialization_alias=\"userName\")\n",
"\n",
"\n",
"type_adapter = TypeAdapter(UserPydanticDataclass)\n",
"\n",
"# data\n",
"json_literal = b'{\"userName\":\"Alice\"}'"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"949 ns ± 46.1 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n"
]
}
],
"source": [
"%timeit type_adapter.validate_json(json_literal)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.42 μs ± 55.3 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)\n"
]
}
],
"source": [
"%timeit converter.loads(json_literal, UserAttrs)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment