perf: optimize dedup, parallelize handle searches and enrichment
The dedup hot path recomputed normalize_text() 4 times per comparison and recomputed item_text() on every inner-loop iteration. Pre-computing n-gram sets and token sets into a _PreparedText cache cuts dedup time by 6x (2.16s to 0.39s on 300 unique items). Bird handle searches spawned one Node process per handle sequentially. Now uses ThreadPoolExecutor so N handles run concurrently. Same pattern applied to YouTube comment enrichment (was serial, Reddit was already parallel) and the retry-thin-sources phase in the pipeline. Clustering now pre-computes candidate text and uses prepared_similarity for the O(n^2) grouping and MMR representative selection loops. Minor: _is_wsl() cached with lru_cache, Bundle.add_items() uses extend() instead of list concatenation. End-to-end: 5.2s -> 3.7s (29% faster) on a typical 4-source query.
This commit is contained in:
@@ -168,8 +168,7 @@ class RetrievalBundle:
|
||||
|
||||
def add_items(self, label: str, source: str, items: list[SourceItem]) -> None:
|
||||
"""Atomically append items to both items_by_source_and_query and items_by_source."""
|
||||
existing = self.items_by_source_and_query.get((label, source), [])
|
||||
self.items_by_source_and_query[(label, source)] = existing + items
|
||||
self.items_by_source_and_query.setdefault((label, source), []).extend(items)
|
||||
self.items_by_source.setdefault(source, []).extend(items)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user