Well, I think it would be an abuse of subs to make it work with your
autoupdating dictionary. If I understand mul_dict, it doesn't contain any
entries at the start -- it becomes populated as you request ei*ej values.
What about using Transform:

# a rule that all Muls get multiplied by 2

>>> m = {}  # the dictionary that keeps track of the rule
>>> (x+x*y+z*a).xreplace(Transform(lambda k: m.setdefault(k, 2*k), lambda
w: w.is_Mul))
2*a*z + 2*x*y + x
>>> m
{x*y: 2*x*y, a*z: 2*a*z}

But that is not the right way to benefit from the dictionary since the
argument to setdefault is called every time. Instead (and I verify by using
the `ok` function that delays the number of seconds equal to its argument)
this is how it should be done:

>>> def ok(i):
...  t=time()
...  while time()-t<i:pass
...  return i
...
>>> (3*x+3*x*y+3*z*a).xreplace(Transform(lambda k: m[k] if k in m else
m.setdefault(k, ok(k)), lambda w: w.is_Integer))
3*a*z + 3*x*y + 3*x

That only takes 3 seconds to run, not 9.

/c

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy?hl=en-US.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to