diff --git a/.jules/bolt.md b/.jules/bolt.md new file mode 100644 index 0000000..af4cbb7 --- /dev/null +++ b/.jules/bolt.md @@ -0,0 +1,3 @@ +## 2023-11-20 - Memoizing regex compilations in ConText +**Learning:** In the openmed clinical text processing pipeline, deterministic regex compilations (via `_compiled_context_lexicon` in `openmed.clinical.context`) create significant performance bottlenecks when repeatedly evaluated across large document streams. Compiling all ConText regexes every time context cues are evaluated is extremely slow because regex parsing adds immense overhead per execution for static definitions. +**Action:** When working on NLP pipelines, always memoize deterministic regex and lexicon compilations, such as using `@functools.lru_cache` to cache instance instantiations that depend merely on a simple string (e.g. language). Ensure that return values are immutable so callers don't accidentally mutate cached instances. diff --git a/openmed/openmed/clinical/context.py b/openmed/openmed/clinical/context.py index 9fd11df..439abc2 100644 --- a/openmed/openmed/clinical/context.py +++ b/openmed/openmed/clinical/context.py @@ -35,6 +35,7 @@ from __future__ import annotations +import functools import re from collections.abc import Iterable, Iterator, Mapping, Sequence from dataclasses import dataclass, replace @@ -154,6 +155,7 @@ class _CompiledContextLexicon: backward_context_cues: frozenset[str] +@functools.lru_cache(maxsize=16) def _compiled_context_lexicon(language: str | None = None) -> _CompiledContextLexicon: lexicon = get_clinical_cue_lexicon(language) token_boundaries = lexicon.token_boundaries