I still don't have a strong oppinion on this. This is mainly because I
would like to see one additional test: Could you compare (timewise)
the creation of say 1 or 10 million (easy) objects based on a version
with and without patch? In principle, I am in favor of you suggestion,
but this seems like a possible issue. If it turns out that it is not,
then you definitely have a +1.

Martin

On 27 Apr., 15:38, John Cremona <john.crem...@gmail.com> wrote:
> +1: I trust you.  That might not be a well-enough informed basis for
> backing the proposal, but it might at least generate some other
> responses!
>
> John
>
>
>
>
>
>
>
> On Wed, Apr 27, 2011 at 2:20 PM, Simon King <simon.k...@uni-jena.de> wrote:
> > Sorry to bother you again, but I think that changes on a very basic
> > level such as sage/structure/element.pxd require sage-devel's
> > blessing.
>
> > On 25 Apr., 19:57, Simon King <simon.k...@uni-jena.de> wrote:
> >> The background of my question is trac ticket #11115. It provides a
> >> Cython version of @cached_method, and it is really fast now.
>
> > To back my claim up: With the patch, I obtain
> > sage: class MyClass:
> > ....:     def __init__(self):
> > ....:         self._cache = {}
> > ....:     @cached_method
> > ....:     def noarg_cache(self):
> > ....:         return True
> > ....:     def noarg(self):
> > ....:         return True
> > ....:     @cached_method
> > ....:     def arg_cache(self,x,n=10):
> > ....:         return x^n
> > ....:     def arg(self,x,n=10):
> > ....:         try:
> > ....:             return self._cache[x,n]
> > ....:         except KeyError:
> > ....:             a = self._cache[x,n] = x^n
> > ....:             return a
> > ....:
> > sage: O = MyClass()
> > sage: timeit('O.noarg_cache()', number=10^6)
> > 1000000 loops, best of 3: 104 ns per loop
> > sage: timeit('O.noarg()', number=10^6)
> > 1000000 loops, best of 3: 237 ns per loop
> > sage: timeit('O.arg_cache(3)', number=10^6)
> > 1000000 loops, best of 3: 942 ns per loop
> > sage: timeit('O.arg(3)', number=10^6)
> > 1000000 loops, best of 3: 844 ns per loop
> > sage: timeit('O.arg_cache(3,10)', number=10^6)
> > 1000000 loops, best of 3: 933 ns per loop
> > sage: timeit('O.arg(3,10)', number=10^6)
> > 1000000 loops, best of 3: 1.01 µs per loop
>
> > So, if there are no arguments then the @cached_method is actually
> > faster than simply returning "True". With arguments, it can compete
> > with a self-made cache written in Python. But of course, using
> > @cached_method is more convenient than a hand-knitted cache.
>
> > Now, the proposed additional attribute is not related with the speedup
> > in the example above. But it would play a role if you have
> >  * a cdef class derived from Element
> >  * that does not allow attribute assignment and
> >  * that inherits a cached method from the category framework.
> > Namely, the additional attribute makes the cache work in the situation
> > above.
>
> > One could argue:
> > 1) The situation above is very rare, and if a developer wants that it
> > works for a cdef class Foo(Element), then s/he can still provide Foo
> > with a "cdef public dict __cached_methods": It is not needed to do
> > that on the level of sage.structure.element.
>
> > or
>
> > 2) I worked with that patch, and I did not see memory problems. So,
> > apparently the additional attribute is lightweight enough. Thus we can
> > afford to make the creation of cached methods via categories as
> > convenient as possible.
>
> > I am in favour of 2).
>
> > Cheers,
> > Simon
>
> > --
> > To post to this group, send an email to sage-devel@googlegroups.com
> > To unsubscribe from this group, send an email to 
> > sage-devel+unsubscr...@googlegroups.com
> > For more options, visit this group 
> > athttp://groups.google.com/group/sage-devel
> > URL:http://www.sagemath.org

-- 
To post to this group, send an email to sage-devel@googlegroups.com
To unsubscribe from this group, send an email to 
sage-devel+unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URL: http://www.sagemath.org

Reply via email to