From 0264bcbe8047e8d74d836a724e278077c98a5807 Mon Sep 17 00:00:00 2001 From: Gustav Bylund Date: Wed, 20 Mar 2024 18:30:37 +0100 Subject: [PATCH] perf(dependencies): skip doing any work when sub dependant is already cached --- fastapi/dependencies/utils.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index c5c6b69bb..66f1d2e53 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -590,6 +590,17 @@ async def solve_dependencies( dependency_cache = {} for sub_dependant in dependant.dependencies: sub_dependant.call = cast(Callable[..., Any], sub_dependant.call) + + if sub_dependant.use_cache: + # Use a unique object to compare against in case the cached value is None + cache_miss = object() + cached_value = dependency_cache.get(sub_dependant.cache_key, cache_miss) + # If the sub dependant is already cached, skip doing any more work + if cached_value is not cache_miss: + if sub_dependant.name is not None: + values[sub_dependant.name] = cached_value + continue + call = sub_dependant.call use_sub_dependant = sub_dependant if ( @@ -624,11 +635,7 @@ async def solve_dependencies( if solved_result.errors: errors.extend(solved_result.errors) continue - if sub_dependant.use_cache and sub_dependant.cache_key in dependency_cache: - solved = dependency_cache[sub_dependant.cache_key] - elif ( - use_sub_dependant.is_gen_callable or use_sub_dependant.is_async_gen_callable - ): + if use_sub_dependant.is_gen_callable or use_sub_dependant.is_async_gen_callable: use_astack = request_astack if sub_dependant.scope == "function": use_astack = function_astack