On 9 Sep., 19:07, Simon King <simon.k...@uni-jena.de> wrote:
> Hi!
>
> While I am at it: Why isn't there a __hash__ method for
> sage.structure.SageObject written in Cython that can be inherited from
> all elements and parents and needs not to be overridden? In
> particular, needs not to be overridden by a slow Python method?
>
> I mean something like
>
>   sage: cython("""
>   cdef class bla:
>       cdef object __hash
>       def __hash__(self):
>           if self.__hash is not None:
>               return self.__hash
>           self.__hash = self._hash_()
>           return self.__hash
>   """)
>   sage: class Foo(bla, object):
>   ....:     def _hash_(self):
>   ....:         return hash(repr(self))
>   ....:
>   sage: f = Foo()
>   sage: %timeit hash(f)
>   625 loops, best of 3: 213 ns per loop
>
> Compare this with the current default __hash__:
>   sage: P = Parent()
>   sage: %timeit hash(P)
>   625 loops, best of 3: 18.9 µs per loop
>
> Hence, for implementing the hash, the user provides _hash_ rather than
> __hash__.
>
> Storing the hash value should be possible, since mutable objects are
> not supposed to be hashable, right?
>
> Of course, that would mean a lot of dull work, namely: Rename any
> __hash__ method into _hash_, for any class derived from SageObject.
> And also "of course", one may provide the possibility to make a class
> unhashable.
>
> But I think if all SageObjects would only need 213 ns rather than 18.9
> µs to return their hash, one could get a very decent general speed-up
> of Sage. So, the dull work could be worth it, isn't it?

Zounds reeznbl, give it a try... :P

(Perhaps ask Robert B. if he could write some script changing all the
instances of __hash__() to _hash_ for classes derived from
SageObject.)

I'm not sure whether one would notice (or even be able to measure) any
performance gain though, since for typical Sage objects most time is
certainly spent in actually computing the hash (assuming the
__hash__() methods are already cached, which I'm not sure about),


-leif

-- 
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