From f58c5030912d612140ef7177825f9d78babe62bf Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Fri, 13 Oct 2017 16:49:51 -0700 Subject: avoid creating lots of dictionaries in traverse_edges() - This is an optimization to the way traverse_edges iterates over successors. - Previous version called dependencies_dict(), which involved a lot of redundant work (creating dicts and calling caonical_deptype) --- lib/spack/spack/spec.py | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 7704d7df72..ed204deb9e 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -1337,27 +1337,26 @@ class Spec(object): # Edge traversal yields but skips children of visited nodes if not (key in visited and cover == 'edges'): + visited.add(key) + # This code determines direction and yields the children/parents if direction == 'children': - successors = self.dependencies_dict(deptype) - succ = lambda s: s.spec + where = self._dependencies + succ = lambda dspec: dspec.spec elif direction == 'parents': - successors = self.dependents_dict(deptype) - succ = lambda s: s.parent + where = self._dependents + succ = lambda dspec: dspec.parent else: raise ValueError('Invalid traversal direction: %s' % direction) - visited.add(key) - for name, dspec in sorted(successors.items()): - child = successors[name] - children = succ(child).traverse_edges( - visited, - d=(d + 1), - deptype=deptype, - dep_spec=dspec, - **kwargs) - for elt in children: - yield elt + for name, dspec in sorted(where.items()): + dt = dspec.deptypes + if dt and not any(d in deptype for d in dt): + continue + + for child in succ(dspec).traverse_edges( + visited, d + 1, deptype, dspec, **kwargs): + yield child # Postorder traversal yields after successors if yield_me and order == 'post': -- cgit v1.2.3-60-g2f50