#8096: Coersion of square matrices is slow
------------------------------+---------------------------------------------
   Reporter:  boothby         |       Owner:  was
       Type:  defect          |      Status:  new
   Priority:  minor           |   Milestone:     
  Component:  linear algebra  |    Keywords:     
     Author:                  |    Upstream:  N/A
   Reviewer:                  |      Merged:     
Work_issues:                  |  
------------------------------+---------------------------------------------
 Multiplication of small square matrices is ridiculously slow:
 {{{
 sage: for d in range(1, 100):
 ...    print d
 ...    A = random_matrix(GF(3), d)
 ...    B = random_matrix(GF(3), d)
 ...    timeit("C = A*B")


 1
 625 loops, best of 3: 93.8 µs per loop
 2
 625 loops, best of 3: 93.9 µs per loop
 3
 625 loops, best of 3: 94.2 µs per loop
 4
 625 loops, best of 3: 94.1 µs per loop
 5
 625 loops, best of 3: 94.7 µs per loop
 6
 625 loops, best of 3: 94.9 µs per loop
 7
 625 loops, best of 3: 95.2 µs per loop
 8
 625 loops, best of 3: 95.8 µs per loop
 9
 625 loops, best of 3: 96.8 µs per loop
 10
 625 loops, best of 3: 97.6 µs per loop
 11
 625 loops, best of 3: 98.1 µs per loop
 12
 625 loops, best of 3: 101 µs per loop
 13
 625 loops, best of 3: 101 µs per loop
 14
 625 loops, best of 3: 104 µs per loop
 15
 625 loops, best of 3: 104 µs per loop
 16
 625 loops, best of 3: 108 µs per loop
 17
 625 loops, best of 3: 108 µs per loop
 18
 625 loops, best of 3: 113 µs per loop
 19
 625 loops, best of 3: 112 µs per loop
 20
 625 loops, best of 3: 118 µs per loop
 21
 625 loops, best of 3: 117 µs per loop
 22
 625 loops, best of 3: 125 µs per loop
 23
 625 loops, best of 3: 123 µs per loop
 24
 625 loops, best of 3: 133 µs per loop
 25
 625 loops, best of 3: 129 µs per loop
 26
 625 loops, best of 3: 143 µs per loop
 27
 625 loops, best of 3: 137 µs per loop
 28
 625 loops, best of 3: 155 µs per loop
 29
 625 loops, best of 3: 147 µs per loop
 30
 625 loops, best of 3: 166 µs per loop
 31
 625 loops, best of 3: 157 µs per loop
 32
 625 loops, best of 3: 179 µs per loop
 33
 625 loops, best of 3: 168 µs per loop
 34
 625 loops, best of 3: 196 µs per loop
 35
 625 loops, best of 3: 182 µs per loop
 36
 625 loops, best of 3: 214 µs per loop
 37
 625 loops, best of 3: 198 µs per loop
 38
 625 loops, best of 3: 234 µs per loop
 39
 625 loops, best of 3: 213 µs per loop
 40
 625 loops, best of 3: 255 µs per loop
 41
 625 loops, best of 3: 231 µs per loop
 42
 625 loops, best of 3: 279 µs per loop
 43
 625 loops, best of 3: 251 µs per loop
 44
 625 loops, best of 3: 307 µs per loop
 45
 625 loops, best of 3: 271 µs per loop
 46
 625 loops, best of 3: 335 µs per loop
 47
 625 loops, best of 3: 298 µs per loop
 48
 625 loops, best of 3: 363 µs per loop
 49
 625 loops, best of 3: 319 µs per loop
 50
 625 loops, best of 3: 401 µs per loop
 51
 625 loops, best of 3: 346 µs per loop
 }}}

 Here's a profile of the 1x1 case:

 {{{
 625 loops, best of 3: 91.7 µs per loop
          810004 function calls in 5.980 CPU seconds

    Ordered by: standard name

    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     40000    0.100    0.000    0.100    0.000 :0(IntegerMod)
     30000    0.080    0.000    0.080    0.000 :0(append)
     10000    0.030    0.000    0.030    0.000 :0(base_ring)
     10000    0.150    0.000    0.900    0.000 :0(category)
     40000    0.250    0.000    0.290    0.000 :0(has_key)
     10000    0.070    0.000    0.070    0.000 :0(hasattr)
     10000    0.030    0.000    0.030    0.000 :0(is_Matrix)
     80000    0.250    0.000    0.250    0.000 :0(isinstance)
     30000    0.070    0.000    0.070    0.000 :0(keys)
     30000    0.040    0.000    0.040    0.000 :0(len)
     30001    0.080    0.000    0.080    0.000 :0(range)
     10000    0.030    0.000    0.030    0.000 :0(setdefault)
         1    0.000    0.000    0.000    0.000 :0(setprofile)
     30000    0.140    0.000    0.140    0.000 :0(sorted)
         1    0.380    0.380    5.980    5.980 <string>:1(<module>)
     30000    0.250    0.000    1.750    0.000 cachefunc.py:155(get_key)
     10000    0.060    0.000    0.850    0.000 cachefunc.py:220(__call__)
     10000    0.060    0.000    0.090    0.000 cachefunc.py:254(get_cache)
     10000    0.050    0.000    0.050    0.000 cachefunc.py:275(__get__)
     20000    0.270    0.000    1.550    0.000 cachefunc.py:76(__call__)
     20000    0.060    0.000    0.060    0.000 cachefunc.py:95(get_cache)
     10000    0.070    0.000    2.520    0.000
 category.py:459(__contains__)
     10000    0.360    0.000    1.550    0.000
 category.py:651(is_subcategory)
     20000    0.120    0.000    1.670    0.000
 classcall_metaclass.py:64(__call__)
     20000    0.040    0.000    0.040    0.000
 finite_field_prime_modn.py:121(characteristic)
     20000    0.110    0.000    0.110    0.000
 finite_field_prime_modn.py:187(order)
     30000    1.010    0.000    1.500    0.000
 function_mangling.py:205(fix_to_pos)
     30000    0.080    0.000    0.080    0.000
 function_mangling.py:261(<genexpr>)
     40000    0.290    0.000    0.390    0.000
 integer_mod_ring.py:733(__call__)
     10000    0.050    0.000    0.070    0.000
 matrix_group_element.py:68(is_MatrixGroupElement)
     10000    0.450    0.000    0.710    0.000 matrix_space.py:1035(matrix)
     10000    0.140    0.000    4.000    0.000
 matrix_space.py:1089(matrix_space)
     10000    0.200    0.000    3.830    0.000
 matrix_space.py:110(MatrixSpace)
     10000    0.000    0.000    0.000    0.000 matrix_space.py:1112(ncols)
     10000    0.030    0.000    0.030    0.000 matrix_space.py:1124(nrows)
     10000    0.310    0.000    1.270    0.000
 matrix_space.py:271(__call__)
     10000    0.000    0.000    0.000    0.000 misc.py:514(get_verbose)
         1    0.000    0.000    5.980    5.980 profile:0(for i in
 range(10000): C = A*B)
         0    0.000             0.000          profile:0(profiler)
     90000    0.270    0.000    0.270    0.000
 unique_representation.py:454(__eq__)
 }}}

-- 
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/8096>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica, 
and MATLAB

-- 
You received this message because you are subscribed to the Google Groups 
"sage-trac" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sage-trac?hl=en.

Reply via email to