From 6a074fff5b65ab8c1539d4a3111bccdcdc7469e6 Mon Sep 17 00:00:00 2001 From: ipeluffo Date: Tue, 14 Apr 2026 11:08:54 +0100 Subject: [PATCH] Refactor `Dependant._security_dependencies` property for improved memory usage ``` Samples: 200000 - current=318.4 MB peak=318.4 MB Samples: 100000 - current=159.2 MB peak=159.2 MB Samples: 50000 - current=79.6 MB peak=79.6 MB Samples: 1000 - current=1.6 MB peak=1.6 MB Samples: 500 - current=0.8 MB peak=0.8 MB ``` --- fastapi/dependencies/models.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fastapi/dependencies/models.py b/fastapi/dependencies/models.py index 7a18d5f515..aeda28ac15 100644 --- a/fastapi/dependencies/models.py +++ b/fastapi/dependencies/models.py @@ -55,6 +55,7 @@ class Dependant: _uses_scopes_cache: bool = field(default=None, init=False, repr=False) _is_security_scheme_cache: bool = field(default=None, init=False, repr=False) _security_scheme_cache: SecurityBase = field(default=None, init=False, repr=False) + _security_dependencies_cache: list["Dependant"] = field(default=None, init=False, repr=False) @property def oauth_scopes(self) -> list[str]: @@ -123,10 +124,13 @@ class Dependant: return self._security_scheme_cache - @cached_property + @property def _security_dependencies(self) -> list["Dependant"]: - security_deps = [dep for dep in self.dependencies if dep._is_security_scheme] - return security_deps + if self._security_dependencies_cache is None: + security_deps = [dep for dep in self.dependencies if dep._is_security_scheme] + self._security_dependencies_cache = security_deps + + return self._security_dependencies_cache @cached_property def is_gen_callable(self) -> bool: