Hi!

When working on improving matrix multiplication, I found that over
finite fields, there is a gigantic overhead:

sage: def test(m):
....:     for i in xrange(10^5):
....:         m*=m
....:
sage: m = matrix(GF(5),[[0,1],[-1,0]])
sage: %prun test(m)
   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall
filename:lineno(function)
   300005    2.763    0.000    3.519    0.000 function_mangling.py:
205(fix_to_pos)
        1    1.989    1.989   13.070   13.070 <ipython console>:
1(test)
   100002    0.904    0.000    3.651    0.000 category.py:
667(is_subcategory)
   100000    0.729    0.000    0.977    0.000 {method '__copy__' of
'sage.matrix.matrix_modn_dense.Matrix_modn_dense' objects}
   100000    0.576    0.000    7.170    0.000 matrix_space.py:
109(MatrixSpace)
   300005    0.465    0.000    3.984    0.000 cachefunc.py:
188(get_key)
   ....


The problems with function_mangling (fix_to_pos), category
(is_subcategory) and cachefunc (get_key) are fixed in #8611 (merged in
sage-4.6.2.alpha2).

The problem with matrix_space (MatrixSpace) is solved in #10763 (needs
review, hint-hint)

There remains the problem with the __copy__ method of matrices. It
turns out that it is used when creating a new zero matrix of the right
dimension that will eventually contain the product.

I have a question: In MatrixSpace.__call__, one can see
        if entries is None or entries == 0:
            if self.__is_sparse: # faster to create a new one than
copy.
                return self.__matrix_class(self, {}, coerce=coerce,
copy=copy)
            else:
                return self.zero_matrix().__copy__()

By some tests, I found that copying (i.e., reading and writing data) a
dense zero matrix over a finite field really is a little faster than
initializing a zero matrix (i.e., just writing data):

sage: MS = MatrixSpace(GF(2),500,500)
sage: C = MS._MatrixSpace_generic__matrix_class
sage: M0 = C(MS, 0, False, False)
sage: timeit("M0.__copy__()")
625 loops, best of 3: 454 µs per loop
sage: timeit("C(MS, 0, False, False)")
625 loops, best of 3: 480 µs per loop

Over the integers, creating a dense zero matrix seems faster than
copying:
sage: MS = MatrixSpace(ZZ,500,500)
sage: C = MS._MatrixSpace_generic__matrix_class
sage: M0 = C(MS,0,False,False)
sage: timeit("M0.__copy__()")
25 loops, best of 3: 17.9 ms per loop
sage: timeit("C(MS,0,False,False)")
25 loops, best of 3: 15.6 ms per loop

My question: Why is copying zero data not much slower than writing
zero data?

Best regards,
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

Reply via email to