Use list instead of OrderedDict to find virtual/external candidates

- This reduces concretization time for r-rminer from over 1 minute to
  only 16 seconds.
  - OrderedDict ends up taking a *lot* of time to compare larger specs.

- An OrderedDict isn't actually needed here.  It's actually not possible
  to find duplicates, and we end up sorting the contents of the
  OrderedDict anyway.
This commit is contained in:
Todd Gamblin 2017-10-13 17:14:42 -07:00
parent f58c503091
commit 3f091fb6db

View File

@ -37,7 +37,6 @@
from six import iteritems
from spack.version import *
from itertools import chain
from ordereddict_backport import OrderedDict
from functools_backport import reverse_order
import spack
@ -80,17 +79,15 @@ def _valid_virtuals_and_externals(self, spec):
# For each candidate package, if it has externals, add those
# to the usable list. if it's not buildable, then *only* add
# the externals.
#
# Use an OrderedDict to avoid duplicates (use it like a set)
usable = OrderedDict()
usable = []
for cspec in candidates:
if is_spec_buildable(cspec):
usable[cspec] = True
usable.append(cspec)
externals = spec_externals(cspec)
for ext in externals:
if ext.satisfies(spec):
usable[ext] = True
usable.append(ext)
# If nothing is in the usable list now, it's because we aren't
# allowed to build anything.