Skip to content

Commit 9ef0eff

Browse files
sir-sigurdclaude
andauthored
Cache RefResolver subschemas lookup per instance (#4590)
_get_subschemas_cache() re-ran a full breadth-first walk of the entire schema document (_search_schema) on every resolve() call, despite its name. The referrer schema is immutable for a resolver instance, so memoize the result. Removes the top self-time hotspot on large templates. Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 928bbff commit 9ef0eff

1 file changed

Lines changed: 4 additions & 0 deletions

File tree

src/cfnlint/schema/resolver/_resolver.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class RefResolver:
6464
_urljoin_cache: Any = field(init=True, default=None)
6565
_cache: Any = field(init=True, default=None)
6666
_cache_cfn_pointer: Any = field(init=True, default=None)
67+
_subschemas_cache: Any = field(init=False, default=None)
6768
store: Any = field(init=True, default=None)
6869

6970
def __post_init__(self):
@@ -296,12 +297,15 @@ def find(key):
296297
return document
297298

298299
def _get_subschemas_cache(self):
300+
if self._subschemas_cache is not None:
301+
return self._subschemas_cache
299302
cache = {key: [] for key in _SUBSCHEMAS_KEYWORDS}
300303
for keyword, subschema in _search_schema(
301304
self.referrer,
302305
_match_subschema_keywords,
303306
):
304307
cache[keyword].append(subschema)
308+
self._subschemas_cache = cache
305309
return cache
306310

307311
def _find_in_subschemas(self, url):

0 commit comments

Comments
 (0)