#7414: improve {from,to}_inversion_vector and to_lehmer_code
------------------------------+---------------------------------------------
   Reporter:  ylchapuy        |       Owner:  mhansen                           
         
       Type:  defect          |      Status:  needs_review                      
         
   Priority:  major           |   Milestone:  sage-combinat                     
         
  Component:  combinatorics   |    Keywords:  permutations, inversion vector, 
lehmer code
Work_issues:                  |      Author:  Yann Laigle-Chapuy                
         
   Reviewer:  Florent Hivert  |      Merged:                                    
         
------------------------------+---------------------------------------------
Changes (by ylchapuy):

  * status:  needs_work => needs_review
  * work_issues:  Large speed regression for small entries =>


Comment:

 I did my best to keep small permutations fast.
 Here are the new timings.

 {{{
 sage: for k in [0,1,2,3,4,5,6,7]:
     L=Permutations(k).list()
     print k
     timeit('[len(p._to_inversion_vector_orig()) for p in L]')
     timeit('[len(p._to_inversion_vector_small()) for p in L]')
     timeit('[len(p.to_inversion_vector()) for p in L]')
 ....:
 0
 625 loops, best of 3: 2.35 µs per loop
 625 loops, best of 3: 3.86 µs per loop
 625 loops, best of 3: 1.43 µs per loop
 1
 625 loops, best of 3: 3.23 µs per loop
 625 loops, best of 3: 4.98 µs per loop
 625 loops, best of 3: 1.54 µs per loop
 2
 625 loops, best of 3: 7.69 µs per loop
 625 loops, best of 3: 12.2 µs per loop
 625 loops, best of 3: 3.13 µs per loop
 3
 625 loops, best of 3: 29.6 µs per loop
 625 loops, best of 3: 38 µs per loop
 625 loops, best of 3: 11.2 µs per loop
 4
 625 loops, best of 3: 152 µs per loop
 625 loops, best of 3: 171 µs per loop
 625 loops, best of 3: 197 µs per loop
 5
 625 loops, best of 3: 957 µs per loop
 625 loops, best of 3: 961 µs per loop
 625 loops, best of 3: 1.09 ms per loop
 6
 125 loops, best of 3: 7.14 ms per loop
 125 loops, best of 3: 6.39 ms per loop
 125 loops, best of 3: 7.12 ms per loop
 7
 5 loops, best of 3: 64.4 ms per loop
 5 loops, best of 3: 51.1 ms per loop
 5 loops, best of 3: 55.5 ms per loop
 }}}

 Timings for big permutations are also quite improved thanks to an improved
 base case.

 {{{
 sage: p= Permutations(1000).random_element()
 sage: timeit('p.to_inversion_vector()')
 125 loops, best of 3: 7.03 ms per loop
 }}}

 As you suggested, I also improved the to_lehmer_code method. Here is the
 comparison, first for small sizes,

 before:
 {{{
 sage: for k in [0,1,2,3,4,5,6]:
 ....:         L=Permutations(k).list()
 ....:     timeit('[len(p.to_lehmer_code()) for p in L]')
 ....:
 625 loops, best of 3: 4.06 µs per loop
 625 loops, best of 3: 5.86 µs per loop
 625 loops, best of 3: 13.8 µs per loop
 625 loops, best of 3: 51.2 µs per loop
 625 loops, best of 3: 248 µs per loop
 625 loops, best of 3: 1.55 ms per loop
 25 loops, best of 3: 11.4 ms per loop
 }}}

 after:
 {{{
 sage: for k in [0,1,2,3,4,5,6]:
 ....:         L=Permutations(k).list()
 ....:     timeit('[len(p.to_lehmer_code()) for p in L]')
 ....:
 625 loops, best of 3: 2.5 µs per loop
 625 loops, best of 3: 3.81 µs per loop
 625 loops, best of 3: 9.44 µs per loop
 625 loops, best of 3: 32 µs per loop
 625 loops, best of 3: 150 µs per loop
 625 loops, best of 3: 880 µs per loop
 125 loops, best of 3: 5.89 ms per loop
 }}}

 and for big sizes,

 before:
 {{{
 sage: for k in [100,300,600,1000]:
 ....:         L=[Permutation(sample(xrange(1,k+1), k)) for _ in
 xrange(10)]
 ....:     timeit('[len(p.to_lehmer_code()) for p in L]')
 ....:
 25 loops, best of 3: 20.2 ms per loop
 5 loops, best of 3: 174 ms per loop
 5 loops, best of 3: 704 ms per loop
 5 loops, best of 3: 1.94 s per loop
 }}}

 after
 {{{
 sage: for k in [100,300,600,1000]:
 ....:         L=[Permutation(sample(xrange(1,k+1), k)) for _ in
 xrange(10)]
 ....:     timeit('[len(p.to_lehmer_code()) for p in L]')
 ....:
 125 loops, best of 3: 1.89 ms per loop
 25 loops, best of 3: 11.2 ms per loop
 25 loops, best of 3: 37.4 ms per loop
 5 loops, best of 3: 69.1 ms per loop
 }}}

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