From 572431066834540127e51bb481e4e8591f73ba2c Mon Sep 17 00:00:00 2001 From: Etienne Cordonnier Date: Wed, 12 Aug 2026 11:12:39 +0200 Subject: [PATCH] python: use _sort_key when encoding object sets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SHACLObjectSet.encode() sorted with key=None, so list.sort used SHACLObject.__lt__ and recomputed the sort key (via getattr) on every comparison. Prefer SHACLObject._sort_key so each object is keyed once. Benchmarked (tests/data/model/test.ttl bindings, 2M link_class objects, JSONLDInlineSerializer): before: 72.4 s after: 58.6 s (~1.24× faster, same sha1) AI-Generated: Composer Signed-off-by: Etienne Cordonnier --- src/shacl2code/lang/templates/python/model.py.j2 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/shacl2code/lang/templates/python/model.py.j2 b/src/shacl2code/lang/templates/python/model.py.j2 index 4c3b27b4..ef1c5a78 100644 --- a/src/shacl2code/lang/templates/python/model.py.j2 +++ b/src/shacl2code/lang/templates/python/model.py.j2 @@ -1820,7 +1820,10 @@ class SHACLObjectSet(object): else: objects = list(self.objects) - objects.sort(key=key) + # Default to _sort_key so Timsort computes each key once. Falling back + # to __lt__ (key=None) rebuilds the key on every comparison via + # getattr, which dominates runtime on large object sets. + objects.sort(key=key if key is not None else SHACLObject._sort_key) if use_list: # Ensure top level objects are only written in the top level graph