+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 <[email protected]> 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 <[email protected]> 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 [email protected]
> To unsubscribe from this group, send an email to 
> [email protected]
> For more options, visit this group at 
> http://groups.google.com/group/sage-devel
> URL: http://www.sagemath.org
>

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

Reply via email to