From ef9c11010d78cf6afca80ecdbbdcf04b817ee827 Mon Sep 17 00:00:00 2001 From: AshNicolus Date: Wed, 27 May 2026 23:34:44 +0530 Subject: [PATCH] Optimize jsonable_encoder to skip building key set when no include/exclude --- fastapi/encoders.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/fastapi/encoders.py b/fastapi/encoders.py index c9f882d2ba..ea6c4ea6d3 100644 --- a/fastapi/encoders.py +++ b/fastapi/encoders.py @@ -280,11 +280,13 @@ def jsonable_encoder( return None if isinstance(obj, dict): encoded_dict = {} - allowed_keys = set(obj.keys()) - if include is not None: - allowed_keys &= set(include) - if exclude is not None: - allowed_keys -= set(exclude) + allowed_keys: set[Any] | None = None + if include is not None or exclude is not None: + allowed_keys = set(obj.keys()) + if include is not None: + allowed_keys &= set(include) + if exclude is not None: + allowed_keys -= set(exclude) for key, value in obj.items(): if ( ( @@ -293,7 +295,7 @@ def jsonable_encoder( or (not key.startswith("_sa")) ) and (value is not None or not exclude_none) - and key in allowed_keys + and (allowed_keys is None or key in allowed_keys) ): encoded_key = jsonable_encoder( key,