#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
-~----------~----~----~----~------~----~------~--~---