#15820: Implement sequences of bounded integers
--------------------------------------------+------------------------
       Reporter:  SimonKing                 |        Owner:
           Type:  enhancement               |       Status:  new
       Priority:  major                     |    Milestone:  sage-6.2
      Component:  algebra                   |   Resolution:
       Keywords:  sequence bounded integer  |    Merged in:
        Authors:                            |    Reviewers:
Report Upstream:  N/A                       |  Work issues:
         Branch:                            |       Commit:
   Dependencies:                            |     Stopgaps:
--------------------------------------------+------------------------

Comment (by SimonKing):

 For completeness, I have added `Path_v6`, which uses Python's `tuple`
 under the hood (which is an obvious way to implement paths, too).

 Result:
 {{{
 sage: %timeit p5*q5
 1000000 loops, best of 3: 439 ns per loop
 sage: %timeit p5*q25
 1000000 loops, best of 3: 542 ns per loop
 sage: %timeit p25*q25
 1000000 loops, best of 3: 612 ns per loop
 sage: %timeit p25*q50
 1000000 loops, best of 3: 869 ns per loop
 sage: %timeit p50*q50
 1000000 loops, best of 3: 1.1 us per loop
 sage: %timeit p50*q100
 1000000 loops, best of 3: 1.39 us per loop
 sage: %timeit p100*q100
 1000000 loops, best of 3: 1.41 us per loop
 sage: %timeit p100*q1000
 100000 loops, best of 3: 5.04 us per loop
 sage: %timeit p1000*q1000
 100000 loops, best of 3: 11 us per loop
 sage: %timeit hash(p5)
 1000000 loops, best of 3: 245 ns per loop
 sage: %timeit hash(p25)
 1000000 loops, best of 3: 532 ns per loop
 sage: %timeit hash(p50)
 1000000 loops, best of 3: 884 ns per loop
 sage: %timeit hash(p100)
 1000000 loops, best of 3: 1.63 us per loop
 sage: %timeit hash(p1000)
 100000 loops, best of 3: 14.6 us per loop
 sage: %timeit p5==s5
 1000000 loops, best of 3: 885 ns per loop
 sage: %timeit p25==s25
 1000000 loops, best of 3: 1.71 us per loop
 sage: %timeit p50==s50
 100000 loops, best of 3: 2.63 us per loop
 sage: %timeit p100==s100
 100000 loops, best of 3: 4.53 us per loop
 sage: %timeit p1000==s1000
 10000 loops, best of 3: 39.3 us per loop
 sage: %timeit p5==r5
 1000000 loops, best of 3: 785 ns per loop
 sage: %timeit p25==r25
 1000000 loops, best of 3: 829 ns per loop
 sage: %timeit p50==r50
 1000000 loops, best of 3: 799 ns per loop
 sage: %timeit p100==r100
 1000000 loops, best of 3: 791 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: 1.48 us per loop
 sage: %timeit q25==r25
 100000 loops, best of 3: 3.72 us per loop
 sage: %timeit q50==r50
 100000 loops, best of 3: 6.63 us per loop
 sage: %timeit q100==r100
 100000 loops, best of 3: 12.5 us per loop
 sage: %timeit q1000==r1000
 10000 loops, best of 3: 116 us per loop
 sage: %timeit q1000.startswith(q100)
 100000 loops, best of 3: 4.7 us per loop
 sage: %timeit q1000.startswith(r100)
 100000 loops, best of 3: 4.72 us per loop
 }}}

 The comparison with the other implementations becomes this:

 1. Concatenation
 {{{
                      5x5   50x50  1000x1000
 Uncompressed long : 739 ns  885 ns 3.06 us  - -
 Uncompressed short: 700 ns  808 ns 2.13 us
 Uncompressed char : 679 ns  772 ns 1.31 us    +
 Compressed   long : 676 ns  759 ns 1.61 us
 Compressed   short: 718 ns  722 ns 1.98 us   +
 Semicompr.   long : 684 ns  827 ns 1.42 us
 Integer           : 645 ns 1.82 us 1.78 us   -
 GMP          mpz_t: 723 ns  799 ns 1.41 us
 tuple             : 439 ns  1.1 us 11   us  + -
 }}}

 2. Hash
 {{{
                      5       100     1000
 Uncompressed long : 135 ns  333 ns  2.09 us  +
 Uncompressed short: 138 ns  383 ns  2.61 us  +--
 Uncompressed char : 133 ns  374 ns  2.53 us  +
 Compressed   long : 132 ns  155 ns   466 ns  +++
 Compressed   short: 132 ns  206 ns   951 ns  +
 Semicompr.   long : 148 ns  194 ns   594 ns
 Integer           : 164 ns  274 ns  1.94 us
 GMP          mpz_t: 159 ns  266 ns  1.93 us
 tuple             : 245 ns 1.63 us 14.6  us  ---
 }}}

 3. == for equal paths
 {{{
                      5       100     1000
 Uncompressed long : 1.63 us 23   us  212   us ---
 Uncompressed short: 1.08 us 14.9 us  137   us
 Uncompressed char : 1.08 us 12.5 us  121   us
 Compressed   long :  710 ns  4.4 us   38   us
 Compressed   short:  723 ns  5.3 us   47.5 us
 Semicompr.   long :  498 ns  712 ns    2.4 us
 Integer           :  667 ns  658 ns    817 ns
 GMP          mpz_t:  466 ns  485 ns    693 ns +++
 tuple             :  885 ns  4.5 us   39.3 us
 }}}

 4. == for "easily" unequal paths
 {{{
                      5       100     1000
 Uncompressed long : 634 ns   686 ns   698 ns
 Uncompressed short: 613 ns   603 ns   635 ns
 Uncompressed char : 581 ns   599 ns   636 ns
 Compressed   long : 692 ns   729 ns   752 ns
 Compressed   short: 577 ns   588 ns   607 ns
 Semicompr.   long : 499 ns   526 ns   545 ns
 Integer           : 746 ns   731 ns   733 ns
 GMP          mpz_t: 451 ns   468 ns   482 ns +++
 tuple             : 785 ns   791 ns   822 ns ---
 }}}

 5. == for "difficult" unequal paths
 {{{
                      5       100      1000
 Uncompressed long : 1.65 us   22   us  213 us   ---
 Uncompressed short: 1.15 us   12.8 us  140 us
 Uncompressed char : 1.06 us   12.7 us  121 us
 Compressed   long :  706 ns    4.4 us   37.6 us
 Compressed   short:  754 ns    5.3 us   47.3 us
 Semicompr.   long :  506 ns    704 ns   2.5 us
 Integer           :  710 ns    719 ns   755 ns
 GMP          mpz_t:  448 ns    457 ns   470 ns  +++
 tuple             : 1.48 us   12.5 us  116 us
 }}}

 6. startswith
 {{{
                      yes      no
 Uncompressed long :  325 ns  311 ns
 Uncompressed short:  336 ns  325 ns
 Uncompressed char :  324 ns  315 ns
 Compressed   long :  272 ns  257 ns  +
 Compressed   short:  272 ns  256 ns  +
 Semicompr.   long :  263 ns  232 ns  ++
 Integer           : 2.46 us 2.45 us
 GMP          mpz_t:  673 ns  657 ns
 tuple             : 4.7  us 4.72 us  --
 }}}

 So, using tuples is best for concatenation of short paths, but that's the
 only case where it is not too slow.

--
Ticket URL: <http://trac.sagemath.org/ticket/15820#comment:18>
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