Le jeudi 02 juin 2011 à 21:28 -0600, Aaron S. Meurer a écrit :
> On Jun 2, 2011, at 9:21 PM, Ronan Lamy wrote:
> 
> > Le jeudi 02 juin 2011 à 17:07 -0600, Aaron S. Meurer a écrit :
> >> On May 31, 2011, at 11:11 AM, Ronan Lamy wrote:
> >> 
> >>> Le mardi 31 mai 2011 à 09:43 -0700, Vinzent Steinberg a écrit :
> >>>> On May 30, 9:52 pm, Mateusz Paprocki <matt...@gmail.com> wrote:
> >>>>> That could work:
> >>>>> 
> >>>>> ZZ.sum([1, 2, 3]) -> sum([1, 2, 3])
> >>>>> RR.sum([1.0, 2.0]) -> mpmath.fsum([1.0, 2.0])
> >>>>> EX.sum([x, y, z]) -> Add(*[x, y, z])
> >>>>> 
> >>>>> etc.
> >>>> 
> >>>> This is exactly what I have been thinking of.
> >>> 
> >>> But do we really need lots of different sum() functions? Is there a
> >>> difference between ZZ.sum([1, 2, 3]) and EX.sum([1, 2, 3])?
> >> 
> >> Yes.  You can sum integers perfectly efficiently just by passing them
> >> to the built-in sum() (also remember that ZZ(1) != S(1) in general
> >> because of the ground types, but EX(1) == S(1) always).
> > 
> > ZZ(1) != S(1), but only some times, is rather counter-intuitive. I don't
> > understand what ZZ is really supposed to mean anyway. If it's the ring
> > of integers, why can its value change? And why is it instantiable?
> 
> ZZ(1) means 1 in the current ground type. If the ground type is Python,
> it returns int(1).  If it's gmpy, it returns mpz(1).  Actually, ZZ(1)
> == S(1) only if you manually choose the sympy ground types.  Note that
> I am using "==" here to mean actually something more like "is".  I
> should really have said "type(ZZ(1)) != type(S(1))".  __eq__ itself
> works as expected regardless of the underlying type.
> 
OK. So "ZZ" means "integer type". That's what I find counter-intuitive
then.

> In general, ZZ stands for the domain of integers, and you can pass it
> to Poly under the domain option (you can also do stuff like ZZ[x] to
> create the domain of polynomials in x with integer coefficients). 
> ZZ(1) is just syntactic sugar that makes it easy to coerce elements to
> that domain.  

OK. By domain, you mean type, right? (That 'ZZ[x]' is a rather confusing
bit of syntactic sugar that seems to suggest a mathematical meaning it
doesn't really have and looks weird when you replace ZZ with any of its
possible values)

> > 
> >>  But something
> >> like Add(*(x, -x, x, x, -x)) is almost two times faster than sum((x,
> >> -x, x, x, -x)):
> > 
> > That's rather an implementation detail, and using Add(*[...]) is wrong
> > anyway, if we want to allow extensions of sympy. Besides, it doesn't
> > explain why EX.sum([n, -n, n, n]) should be different from ZZ.sum([n,
> > -n, n, n]).
> 
> Do you mean that n is symbolic?  If so, then ZZ.sum([n, -n, n, n])
> doesn't make sense.
> 
It would make sense if 'ZZ' meant 'the ring of integers'. Actually, even
though that's not the case, it works anyway because ZZ.sum is always
just sum.

> Aaron Meurer
> 
> > 
> >> 
> >> In [1]: Add(*(x, -x, x, x, -x))
> >> Out[1]: x
> >> 
> >> In [2]: %timeit Add(*(x, -x, x, x, -x))
> >> 1000 loops, best of 3: 170 us per loop
> >> 
> >> In [3]: sum((x, -x, x, x, -x))
> >> Out[3]: x
> >> 
> >> In [4]: %timeit sum((x, -x, x, x, -x))
> >> 1000 loops, best of 3: 313 us per loop
> >> 
> >> In [16]: b = map(S, range(100))
> >> 
> >> In [24]: %timeit Add(*b)
> >> 1000 loops, best of 3: 546 us per loop
> >> 
> >> In [25]: %timeit sum(b)
> >> 1000 loops, best of 3: 268 us per loop
> >> 
> >> (all run without the cache, as suggested above).  Note that [16]
> >> ensures that sum(b) goes through Add.  Otherwise, you get
> >> 
> >> In [26]: %timeit Add(*range(100))
> >> 1000 loops, best of 3: 1.45 ms per loop
> >> 
> >> In [27]: %timeit sum(range(100))
> >> 100000 loops, best of 3: 2.7 us per loop
> >> 
> >> which just proves what we already know, which is that Python ints are
> >> (apparently 10x) faster than SymPy Integers.  
> >> 
> >> Aaron Meurer
> >> 
> > 
> > 
> > -- 
> > You received this message because you are subscribed to the Google Groups 
> > "sympy" group.
> > To post to this group, send email to sympy@googlegroups.com.
> > To unsubscribe from this group, send email to 
> > sympy+unsubscr...@googlegroups.com.
> > For more options, visit this group at 
> > http://groups.google.com/group/sympy?hl=en.
> > 
> 


-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To post to this group, send email to sympy@googlegroups.com.
To unsubscribe from this group, send email to 
sympy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sympy?hl=en.

Reply via email to