#15820: Improve efficiency of the path semigroup
--------------------------------------------------+------------------------
       Reporter:  SimonKing                       |        Owner:
           Type:  enhancement                     |       Status:  new
       Priority:  major                           |    Milestone:  sage-6.2
      Component:  algebra                         |   Resolution:
       Keywords:  quiver path algebra efficiency  |    Merged in:
        Authors:                                  |    Reviewers:
Report Upstream:  N/A                             |  Work issues:
         Branch:                                  |       Commit:
   Dependencies:  #12630                          |     Stopgaps:
--------------------------------------------------+------------------------

Comment (by SimonKing):

 I have replaced [attachment:path_test.pyx] again, adding two more
 implementations.

 Do you have further suggestions on storage of lists of bounded integers?
 If you haven't, then I'll try to assess the timings stated in the various
 comments, according to what I expect to be useful in my applications.

 Here are details on the two new implementations:

 In `Path_v3`, I use Sage's `Integer` class as bit list. Sounds crazy, but
 it works rather well. I assume that bitshifts and comparison (and that's
 what we are using here) are internally written in assembler, and for us,
 the additional benefit is that we do not need to take care about the size
 of blocks (8 bit? 32 bit? 64 bit? 128 bit?) in which we store
 stuff---`Integer` does it for us. Perhaps the timings could be improved
 further by using the underlying c-library (GMP's `mpz_t`) directly.

 In `Path_v4`, I provide a slightly simplified version of `Path_v2`: The
 data is compressed, but so that the chunks used to store one arrow fit
 seamlessly into a memory block. Hence, when we use 64-bit blocks, and have
 27 arrows, then `Path_v2` would store the arrows in chunks of 5 bit
 (hence, it can store 12 arrows in one memory block, leaving 4 bit empty),
 whereas `Path_v4` would store the arrows in chunks of 8 bit (hence, it can
 only store 8 arrows in one memory block, but since this fits neatly into
 one memory block, the code can be simplified).

 The timings for `Path_v3`:
 {{{
 sage: %timeit p5*q5
 1000000 loops, best of 3: 645 ns per loop
 sage: %timeit p5*q25
 1000000 loops, best of 3: 631 ns per loop
 sage: %timeit p25*q25
 1000000 loops, best of 3: 635 ns per loop
 sage: %timeit p25*q50
 1000000 loops, best of 3: 1.23 us per loop
 sage: %timeit p50*q50
 1000000 loops, best of 3: 1.82 us per loop
 sage: %timeit p50*q100
 1000000 loops, best of 3: 1.83 us per loop
 sage: %timeit p100*q100
 1000000 loops, best of 3: 1.37 us per loop
 sage: %timeit p100*q1000
 1000000 loops, best of 3: 1.82 us per loop
 sage: %timeit p1000*q1000
 1000000 loops, best of 3: 1.78 us per loop
 sage: %timeit hash(p5)
 10000000 loops, best of 3: 164 ns per loop
 sage: %timeit hash(p25)
 10000000 loops, best of 3: 197 ns per loop
 sage: %timeit hash(p50)
 1000000 loops, best of 3: 210 ns per loop
 sage: %timeit hash(p100)
 1000000 loops, best of 3: 274 ns per loop
 sage: %timeit hash(p1000)
 1000000 loops, best of 3: 1.94 us per loop
 sage: %timeit p5==s5
 1000000 loops, best of 3: 667 ns per loop
 sage: %timeit p25==s25
 1000000 loops, best of 3: 638 ns per loop
 sage: %timeit p50==s50
 1000000 loops, best of 3: 693 ns per loop
 sage: %timeit p100==s100
 1000000 loops, best of 3: 658 ns per loop
 sage: %timeit p1000==s1000
 1000000 loops, best of 3: 817 ns per loop
 sage: %timeit p5==r5
 1000000 loops, best of 3: 746 ns per loop
 sage: %timeit p25==r25
 1000000 loops, best of 3: 723 ns per loop
 sage: %timeit p50==r50
 1000000 loops, best of 3: 769 ns per loop
 sage: %timeit p100==r100
 1000000 loops, best of 3: 731 ns per loop
 sage: %timeit p1000==r1000
 1000000 loops, best of 3: 733 ns per loop
 sage: %timeit q5==r5
 1000000 loops, best of 3: 710 ns per loop
 sage: %timeit q25==r25
 1000000 loops, best of 3: 733 ns per loop
 sage: %timeit q50==r50
 1000000 loops, best of 3: 718 ns per loop
 sage: %timeit q100==r100
 1000000 loops, best of 3: 719 ns per loop
 sage: %timeit q1000==r1000
 1000000 loops, best of 3: 755 ns per loop
 sage: %timeit q1000.startswith(q100)
 100000 loops, best of 3: 2.46 us per loop
 sage: %timeit q1000.startswith(r100)
 100000 loops, best of 3: 2.45 us per loop
 }}}

 The timings for `Path_v4`:
 {{{
 sage: %timeit p5*q5
 1000000 loops, best of 3: 730 ns per loop
 sage: %timeit p5*q25
 1000000 loops, best of 3: 762 ns per loop
 sage: %timeit p25*q25
 1000000 loops, best of 3: 806 ns per loop
 sage: %timeit p25*q50
 1000000 loops, best of 3: 849 ns per loop
 sage: %timeit p50*q50
 1000000 loops, best of 3: 854 ns per loop
 sage: %timeit p50*q100
 1000000 loops, best of 3: 931 ns per loop
 sage: %timeit p100*q100
 1000000 loops, best of 3: 930 ns per loop
 sage: %timeit p100*q1000
 1000000 loops, best of 3: 1.97 us per loop
 sage: %timeit p1000*q1000
 1000000 loops, best of 3: 1.45 us per loop
 sage: %timeit hash(p5)
 10000000 loops, best of 3: 136 ns per loop
 sage: %timeit hash(p25)
 10000000 loops, best of 3: 148 ns per loop
 sage: %timeit hash(p50)
 10000000 loops, best of 3: 159 ns per loop
 sage: %timeit hash(p100)
 10000000 loops, best of 3: 182 ns per loop
 sage: %timeit hash(p1000)
 1000000 loops, best of 3: 600 ns per loop
 sage: %timeit p5==s5
 1000000 loops, best of 3: 700 ns per loop
 sage: %timeit p25==s25
 1000000 loops, best of 3: 1.65 us per loop
 sage: %timeit p50==s50
 100000 loops, best of 3: 2.48 us per loop
 sage: %timeit p100==s100
 100000 loops, best of 3: 4.21 us per loop
 sage: %timeit p1000==s1000
 10000 loops, best of 3: 36.4 us per loop
 sage: %timeit p5==r5
 100000 loops, best of 3: 706 ns per loop
 sage: %timeit p25==r25
 1000000 loops, best of 3: 764 ns per loop
 sage: %timeit p50==r50
 1000000 loops, best of 3: 740 ns per loop
 sage: %timeit p100==r100
 1000000 loops, best of 3: 742 ns per loop
 sage: %timeit p1000==r1000
 1000000 loops, best of 3: 822 ns per loop
 sage: %timeit q5==r5
 1000000 loops, best of 3: 693 ns per loop
 sage: %timeit q25==r25
 1000000 loops, best of 3: 1.6 us per loop
 sage: %timeit q50==r50
 100000 loops, best of 3: 2.54 us per loop
 sage: %timeit q100==r100
 100000 loops, best of 3: 4.27 us per loop
 sage: %timeit q1000==r1000
 10000 loops, best of 3: 37.1 us per loop
 sage: %timeit q1000.startswith(q100)
 1000000 loops, best of 3: 255 ns per loop
 sage: %timeit q1000.startswith(r100)
 1000000 loops, best of 3: 243 ns per loop
 }}}

--
Ticket URL: <http://trac.sagemath.org/ticket/15820#comment:8>
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 unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sage-trac.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to