From f171a001919f6f9e3dca935ab6fd2a4d1fed3778 Mon Sep 17 00:00:00 2001 From: Ulf Magnusson Date: Thu, 18 Jun 2015 16:25:25 +0200 Subject: Optimize _get_expr_syms(). Instantiating that nested function with free variables turned out to be quite expensive in cProfile. For the _build_dep() case, it would be even neater to have a function like _add_sym_deps(sym, expr) that adds 'sym' to each 'deps' set in 'expr', removing the need for a temporary set. Unfortunately, _get_expr_syms() is used elsewhere too, and it's probably not worthwhile having another very similar function just as a small optimization. --- kconfiglib.py | 48 ++++++++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/kconfiglib.py b/kconfiglib.py index 9632b3e..2219ed6 100644 --- a/kconfiglib.py +++ b/kconfiglib.py @@ -3230,35 +3230,31 @@ def _make_or(e1, e2): return (OR, [e1, e2]) +def _get_expr_syms_rec(expr, res): + """_get_expr_syms() helper. Recurses through expressions.""" + if isinstance(expr, Symbol): + res.add(expr) + elif isinstance(expr, str): + return + elif expr[0] == AND or expr[0] == OR: + for term in expr[1]: + _get_expr_syms_rec(term, res) + elif expr[0] == NOT: + _get_expr_syms_rec(expr[1], res) + elif expr[0] == EQUAL or expr[0] == UNEQUAL: + if isinstance(expr[1], Symbol): + res.add(expr[1]) + if isinstance(expr[2], Symbol): + res.add(expr[2]) + else: + _internal_error("Internal error while fetching symbols from an " + "expression with token stream {0}.".format(expr)) + def _get_expr_syms(expr): """Returns the set() of symbols appearing in expr.""" res = set() - if expr is None: - return res - - def rec(expr): - if isinstance(expr, Symbol): - res.add(expr) - return - if isinstance(expr, str): - return - - if expr[0] == AND or expr[0] == OR: - for term in expr[1]: - rec(term) - elif expr[0] == NOT: - rec(expr[1]) - elif expr[0] == EQUAL or expr[0] == UNEQUAL: - _, v1, v2 = expr - if isinstance(v1, Symbol): - res.add(v1) - if isinstance(v2, Symbol): - res.add(v2) - else: - _internal_error("Internal error while fetching symbols from an " - "expression with token stream {0}.".format(expr)) - - rec(expr) + if expr is not None: + _get_expr_syms_rec(expr, res) return res def _str_val(obj): -- cgit v1.2.3