From 0821c80554223dfbeb610061578a811679e001fa Mon Sep 17 00:00:00 2001
From: Gustav Bylund <gustav.bylund@sick.se>
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 | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py
index 8a54d1ee7..fc5e8c60e 100644
--- a/fastapi/dependencies/utils.py
+++ b/fastapi/dependencies/utils.py
@@ -595,6 +595,17 @@ async def solve_dependencies(
         sub_dependant.cache_key = cast(
             Tuple[Callable[..., Any], Tuple[str]], sub_dependant.cache_key
         )
+
+        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 (
@@ -628,9 +639,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 is_gen_callable(call) or is_async_gen_callable(call):
+        if is_gen_callable(call) or is_async_gen_callable(call):
             solved = await solve_generator(
                 call=call, stack=async_exit_stack, sub_values=solved_result.values
             )