Ticket #11589: trac_11589.patch

File trac_11589.patch, 4.6 KB (added by malb, 10 years ago)
  • sage/ext/stdsage.pxi

    # HG changeset patch
    # User Martin Albrecht <martinralbrecht@googlemail.com>
    # Date 1310422263 -3600
    # Node ID 968f117af9b61e867faef281100147aea62e54bc
    # Parent  53ff621d36eb55f1c8ce9261ccc61b062f065749
    #11589 faster creation of zero matrices
    
    diff -r 53ff621d36eb -r 968f117af9b6 sage/ext/stdsage.pxi
    a b  
    4343    void  sage_free(void *p)
    4444    void* sage_realloc(void *p, size_t n)
    4545    void* sage_malloc(size_t)
     46    void* sage_calloc(size_t nmemb, size_t size)
    4647    void  init_csage()
    4748    void  init_csage_module()
    4849    void  init_memory_functions()
  • sage/matrix/matrix_modn_dense.pyx

    diff -r 53ff621d36eb -r 968f117af9b6 sage/matrix/matrix_modn_dense.pyx
    a b  
    186186            raise OverflowError, "p (=%s) must be < %s"%(p, MAX_MODULUS)
    187187        self.gather = MOD_INT_OVERFLOW/<mod_int>(p*p)
    188188
    189         sig_on()
    190         self._entries = <mod_int *> sage_malloc(sizeof(mod_int)*self._nrows*self._ncols)
    191         sig_off()
     189        if not isinstance(entries, list):
     190            sig_on()
     191            self._entries = <mod_int *> sage_calloc(self._nrows*self._ncols,sizeof(mod_int))
     192            sig_off()
     193        else:
     194            sig_on()
     195            self._entries = <mod_int *> sage_malloc(self._nrows*self._ncols * sizeof(mod_int))
     196            sig_off()
     197       
    192198        if self._entries == NULL:
    193199           raise MemoryError, "Error allocating matrix"       
    194200
     
    230236
    231237        # scalar?
    232238        if not isinstance(entries, list):
    233             sig_on()
    234             for i from 0 <= i < self._nrows*self._ncols:
    235                 self._entries[i] = 0
    236             sig_off()
     239            # sig_on()
     240            # for i from 0 <= i < self._nrows*self._ncols:
     241            #     self._entries[i] = 0
     242            # sig_off()
    237243            if entries is None:
    238244                # zero matrix
    239245                pass
  • sage/matrix/matrix_space.py

    diff -r 53ff621d36eb -r 968f117af9b6 sage/matrix/matrix_space.py
    a b  
    7777import sage.rings.finite_rings.integer_mod_ring
    7878import sage.rings.polynomial.multi_polynomial_ring_generic
    7979import sage.misc.latex as latex
    80 #import sage.rings.real_double as real_double
    8180import sage.misc.mrange
    8281import sage.modules.free_module_element
    8382import sage.modules.free_module
    8483from sage.structure.sequence import Sequence
    8584
     85from sage.misc.all import lazy_attribute
     86
    8687from sage.categories.rings import Rings
    8788
    8889def is_MatrixSpace(x):
     
    267268        """
    268269        return MatrixSpace, (self.base_ring(), self.__nrows, self.__ncols, self.__is_sparse)
    269270
     271    @lazy_attribute
     272    def _copy_zero(self):
     273        """
     274        Is it faster to copy a zero matrix or is it faster to create a
     275        new matrix from scratch?
     276
     277        EXAMPLE::
     278
     279            sage: MS = MatrixSpace(GF(2),200,200)
     280            sage: MS._copy_zero
     281            False
     282
     283            sage: MS = MatrixSpace(GF(3),20,20)
     284            sage: MS._copy_zero
     285            True
     286
     287            sage: MS = MatrixSpace(GF(3),200,200)
     288            sage: MS._copy_zero
     289            False
     290
     291            sage: MS = MatrixSpace(ZZ,200,200)
     292            sage: MS._copy_zero
     293            True
     294        """
     295        if self.__is_sparse:
     296            return False
     297        elif self.__matrix_class is sage.matrix.matrix_mod2_dense.Matrix_mod2_dense:
     298            return False
     299        elif self.__matrix_class == sage.matrix.matrix_modn_dense.Matrix_modn_dense:
     300            if self.__nrows > 100 and self.__ncols > 100:
     301                return False
     302            else:
     303                return True
     304        else:
     305            return True
     306
    270307    def __call__(self, entries=0, coerce=True, copy=True, rows=None):
    271308        """
    272309        EXAMPLES::
     
    353390            True
    354391        """
    355392        if entries is None or entries == 0:
    356             if self.__is_sparse: # faster to create a new one than copy.
    357                 return self.__matrix_class(self, {}, coerce=coerce, copy=copy)
     393            if self._copy_zero: # faster to copy than to create a new one.
     394                return self.zero_matrix().__copy__()
    358395            else:
    359                 return self.zero_matrix().__copy__()
     396                return self.__matrix_class(self, 0, coerce=coerce, copy=copy)
    360397
    361398        if isinstance(entries, (list, tuple)) and len(entries) > 0 and \
    362399           sage.modules.free_module_element.is_FreeModuleElement(entries[0]):