This function is called extremely frequently with similar arguments, so
this optimization reduces "emerge -uDvpU --with-bdeps=y @world" runtime from
43.5 -> 34.5s -- a 25.8% speedup.
---
 lib/portage/dep/__init__.py | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/lib/portage/dep/__init__.py b/lib/portage/dep/__init__.py
index 72988357a..df296dd81 100644
--- a/lib/portage/dep/__init__.py
+++ b/lib/portage/dep/__init__.py
@@ -404,6 +404,8 @@ def paren_enclose(mylist, unevaluated_atom=False, 
opconvert=False):
                        mystrparts.append(x)
        return " ".join(mystrparts)
 
+_use_reduce_cache = {}
+
 def use_reduce(depstr, uselist=(), masklist=(), matchall=False, excludeall=(), 
is_src_uri=False, \
        eapi=None, opconvert=False, flat=False, is_valid_flag=None, 
token_class=None, matchnone=False,
        subset=None):
@@ -440,6 +442,27 @@ def use_reduce(depstr, uselist=(), masklist=(), 
matchall=False, excludeall=(), i
        @rtype: List
        @return: The use reduced depend array
        """
+       uselist_key = None
+       masklist_key = None
+       excludeall_key = None
+       subset_key = None
+       if uselist is not None:
+           uselist_key = tuple(uselist)
+       if masklist is not None:
+           masklist_key = tuple(masklist)
+       if excludeall is not None:
+           excludeall_key = tuple(excludeall)
+       if subset is not None:
+           subset_key = tuple(subset)
+       cache_key = (depstr, uselist_key, masklist_key, matchall, 
excludeall_key, \
+               is_src_uri, eapi, opconvert, flat, is_valid_flag, token_class, \
+               matchnone, subset_key)
+
+       cache_entry = _use_reduce_cache.get(cache_key)
+       if cache_entry is not None:
+               # The list returned by this function may be modified, so return 
a copy.
+               return cache_entry[:]
+
        if isinstance(depstr, list):
                if portage._internal_caller:
                        warnings.warn(_("Passing paren_reduced dep arrays to %s 
is deprecated. " + \
@@ -767,6 +790,9 @@ def use_reduce(depstr, uselist=(), masklist=(), 
matchall=False, excludeall=(), i
                raise InvalidDependString(
                        _("Missing file name at end of string"))
 
+       # The list returned by this function may be modified, so store a copy.
+       _use_reduce_cache[cache_key] = stack[0][:]
+
        return stack[0]
 
 def dep_opconvert(deplist):
-- 
2.27.0.212.ge8ba1cc988-goog


Reply via email to