From 481f7fde084e01f2bbe117efd03d9bedb67db133 Mon Sep 17 00:00:00 2001 From: Niels Thykier Date: Sat, 28 May 2016 07:37:06 +0000 Subject: [PATCH] auto-hinter: Reduce size of inner loop Reduce a "loop over all valid items" to a "loop over an item's dependencies + reverse dependencies". For sparse graphs, this is much more efficient. Signed-off-by: Niels Thykier --- britney.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/britney.py b/britney.py index be35d17..49e1559 100755 --- a/britney.py +++ b/britney.py @@ -2880,6 +2880,10 @@ class Britney(object): if y not in sources_t or sources_t[y][VERSION] != excuses[y].ver[1]) excuses_deps = {name: valid_excuses.intersection(excuse.deps) for name, excuse in excuses.items() if name in valid_excuses} + excuses_rdeps = defaultdict(set) + for name, deps in excuses_deps.items(): + for dep in deps: + excuses_rdeps[dep].add(name) def find_related(e, hint, circular_first=False): excuse = excuses[e] @@ -2916,9 +2920,9 @@ class Britney(object): for item, ver in items: # excuses which depend on "item" or are depended on by it - new_items = set((x, excuses[x].ver[1]) for x in valid_excuses if - (item in excuses_deps[x] or x in excuses_deps[item]) and - (x, excuses[x].ver[1]) not in seen_items) + new_items = set((x, excuses[x].ver[1]) for x in excuses_deps[item]) + new_items.update((x, excuses[x].ver[1]) for x in excuses_rdeps[item]) + new_items -= seen_items items.extend(new_items) seen_items.update(new_items)