Hi Martin,

On 10 Jul., 20:38, Martin Albrecht <martinralbre...@googlemail.com>
wrote:
> Which makes sense because we always return a zero matrix when we allocate in
> M4RI, so copy() is alloc + memcpy while just creating it is just an alloc.

How does  that work? I learnt the hard way: Allocating memory does not
necessarily mean that the memory is initialised by zeroes. Perhaps the
other matrix classes can benefit from M4RI's way to create initialised
memory?

> I guess one approach could be a class attribute which determines whether a
> cache should be used or not (i.e. by type). Another one would decide based on 
>  
> some dimension (I don't know which since that depends on the implementation
> heavily).

According to Robert, the fastest way to create an empty matrix depends
not only on the class but on the dimensions. My main concern is that
doing an elaborate test - repeated each time a zero matrix is created
- would considerably slow things down. Therefore, my first suggestion
was to introduce a static method of the matrix classes (see post
above).

But I forgot that the test actually needs to be done only once for
each matrix class: It is an ideal candidate for a lazy attribute of
MatrixSpace_generic! Hence, we may do something like
    @lazy_attribute
    def _copy_zero(self):
        if self.__is_sparse:
            return False
        if self.__matrix_class ==
sage.matrix.matrix_mod2_dense.Matrix_mod2_dense:
            return False
        if self.__matrix_class ==
sage.matrix.matrix_modn_dense.Matrix_modn_dense:
            if self._nrows>... and self._ncols>...:
                return False
            else:
                return True
        ...<do something for matrices over ZZ and so on>...
        return True

    def __call__(self,...):
        ...
        if entries is None or entries == 0:
            if self._copy_zero: # faster to copy than to create a new
one.
                return self.zero_matrix().__copy__()
            else:
                return self.__matrix_class(self, {}, coerce=coerce,
copy=copy)

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

Reply via email to