From 613d1339b5baeceb016af151e8920270d5e5cc2d Mon Sep 17 00:00:00 2001 From: dandiep Date: Sun, 27 Apr 2025 17:23:10 -0700 Subject: [PATCH 1/2] Add caching for function signatures to improve performance --- src/dependency_injector/wiring.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/dependency_injector/wiring.py b/src/dependency_injector/wiring.py index 9de6f823..221eec79 100644 --- a/src/dependency_injector/wiring.py +++ b/src/dependency_injector/wiring.py @@ -591,9 +591,18 @@ def _extract_marker(parameter: inspect.Parameter) -> Optional["_Marker"]: return marker -def _fetch_reference_injections( # noqa: C901 +_signature_cache: Dict[int, Tuple[Dict[str, Any], Dict[str, Any]]] = {} + + +def _fetch_reference_injections( fn: Callable[..., Any], ) -> Tuple[Dict[str, Any], Dict[str, Any]]: + """Get reference injections with caching.""" + # Use the function's id as cache key + fn_id = id(fn) + if fn_id in _signature_cache: + return _signature_cache[fn_id] + # Hotfix, see: # - https://github.com/ets-labs/python-dependency-injector/issues/362 # - https://github.com/ets-labs/python-dependency-injector/issues/398 @@ -606,9 +615,13 @@ def _fetch_reference_injections( # noqa: C901 signature = inspect.signature(fn) except ValueError as exception: if "no signature found" in str(exception): - return {}, {} + result = {}, {} + _signature_cache[fn_id] = result + return result elif "not supported by signature" in str(exception): - return {}, {} + result = {}, {} + _signature_cache[fn_id] = result + return result else: raise exception @@ -625,7 +638,11 @@ def _fetch_reference_injections( # noqa: C901 closing[parameter_name] = marker injections[parameter_name] = marker - return injections, closing + + # Cache the result + result = (injections, closing) + _signature_cache[fn_id] = result + return result def _locate_dependent_closing_args( @@ -1036,4 +1053,5 @@ def _patched(*args, **kwargs): patched.injections, patched.closing, ) + return cast(F, _patched) From e400d7eaa79f3a871b63855e5a87bf3a10126671 Mon Sep 17 00:00:00 2001 From: dandiep Date: Sun, 27 Apr 2025 17:27:59 -0700 Subject: [PATCH 2/2] Minor tweaks to patch --- src/dependency_injector/wiring.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/dependency_injector/wiring.py b/src/dependency_injector/wiring.py index 221eec79..c2f126ff 100644 --- a/src/dependency_injector/wiring.py +++ b/src/dependency_injector/wiring.py @@ -594,7 +594,7 @@ def _extract_marker(parameter: inspect.Parameter) -> Optional["_Marker"]: _signature_cache: Dict[int, Tuple[Dict[str, Any], Dict[str, Any]]] = {} -def _fetch_reference_injections( +def _fetch_reference_injections( # noqa: C901 fn: Callable[..., Any], ) -> Tuple[Dict[str, Any], Dict[str, Any]]: """Get reference injections with caching.""" @@ -639,7 +639,6 @@ def _fetch_reference_injections( injections[parameter_name] = marker - # Cache the result result = (injections, closing) _signature_cache[fn_id] = result return result