Skip to content

Commit 60242e7

Browse files
committed
perf: Cache reference lookups for subschemas
1 parent 0878727 commit 60242e7

File tree

2 files changed

+18
-7
lines changed

2 files changed

+18
-7
lines changed

CHANGELOG.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ v4.3.0
33

44
* Fix undesired fallback to brute force container uniqueness check on
55
certain input types (#893)
6+
* Cache reference lookups for subschemas (#893)
67
* Implement a PEP544 Protocol for validator classes (#890)
78

89
v4.2.1

jsonschema/validators.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -767,22 +767,32 @@ def _finditem(self, schema, key):
767767
yield each
768768
values.extendleft(each.values())
769769

770-
def resolve(self, ref):
771-
"""
772-
Resolve the given reference.
773-
"""
774-
url = self._urljoin_cache(self.resolution_scope, ref).rstrip("/")
770+
@lru_cache()
771+
def _find_subschemas(self):
772+
return list(self._finditem(self.referrer, "$id"))
775773

774+
@lru_cache()
775+
def _find_in_subschemas(self, url):
776776
uri, fragment = urldefrag(url)
777-
778-
for subschema in self._finditem(self.referrer, "$id"):
777+
for subschema in self._find_subschemas():
779778
target_uri = self._urljoin_cache(
780779
self.resolution_scope, subschema["$id"],
781780
)
782781
if target_uri.rstrip("/") == uri.rstrip("/"):
783782
if fragment:
784783
subschema = self.resolve_fragment(subschema, fragment)
785784
return url, subschema
785+
return None
786+
787+
def resolve(self, ref):
788+
"""
789+
Resolve the given reference.
790+
"""
791+
url = self._urljoin_cache(self.resolution_scope, ref).rstrip("/")
792+
793+
match = self._find_in_subschemas(url)
794+
if match is not None:
795+
return match
786796

787797
return url, self._remote_cache(url)
788798

0 commit comments

Comments
 (0)