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?

Best regards,
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 at http://groups.google.com/group/sage-devel
URL: http://www.sagemath.org

Reply via email to