#7520: Improving word construction
-------------------------------+--------------------------------------------
Reporter: slabbe | Owner: slabbe
Type: enhancement | Status: needs_review
Priority: major | Milestone: sage-4.3.3
Component: combinatorics | Keywords:
Author: Sebastien Labbe | Upstream: N/A
Reviewer: | Merged:
Work_issues: |
-------------------------------+--------------------------------------------
Old description:
> (1) The {{{_check}}} function of the Combinatorial class of all words
> (checking that the 40 first letters of the word are in the parent) is
> called for each word created by the user ....and by any other function.
> It would be good to add a check parameter (True or False) whether to do
> the checking. For example, for internal function, it could be turned off.
> Here is a example of what can be gained from this modification when
> generating all words of a given length :
>
> BEFORE:
> {{{
> sage: W = Words([0,1])
> sage: time l = list(W.iterate_by_length(15))
> CPU times: user 2.60 s, sys: 0.09 s, total: 2.69 s
> Wall time: 2.71 s
> }}}
>
> AFTER:
>
> {{{
> sage: W = Words([0,1])
> sage: time l = list(W.iterate_by_length(15))
> CPU times: user 1.99 s, sys: 0.06 s, total: 2.05 s
> Wall time: 2.08 s
> }}}
>
> (2) Improvement in the creation of a word from a word when the parent
> changes :
>
> BEFORE:
>
> {{{
> sage: w = Word('abab')
> sage: P = WordPaths('abcd')
> sage: P(w)
> word: abab
> sage: type(w)
> <class 'sage.combinat.words.word.FiniteWord_str'>
> sage: type(P(w))
> <class 'sage.combinat.words.word.FiniteWord_str'>
> }}}
>
> AFTER:
>
> {{{
> sage: w = Word('abab')
> sage: P = WordPaths('abcd')
> sage: P(w)
> Path: abab
> sage: type(w)
> <class 'sage.combinat.words.word.FiniteWord_str'>
> sage: type(P(w))
> <class 'sage.combinat.words.paths.FiniteWordPath_square_grid_str'>
> }}}
>
> The following construction gets also faster with the patch applied :
>
> BEFORE:
>
> {{{
> sage: w = Word([0,1]*10000)
> sage: %timeit z = Words([2,0,1])(w)
> 1000 loops, best of 3: 586 µs per loop
> }}}
>
> AFTER:
>
> {{{
> sage: w = Word([0,1]*10000)
> sage: %timeit z = Words([2,0,1])(w)
> 1000 loops, best of 3: 343 µs per loop
> }}}
>
> (3) `WordMorphism.__call__` is doing a conversion of the input into the
> domain which is not necessary. Basicly, all what is needed is that the
> input be iterable. Here are some timing improvements :
>
> BEFORE:
>
> {{{
> sage: m = WordMorphism('a->aab,b->ba')
> sage: %timeit w = m('a'*100)
> 1000 loops, best of 3: 343 µs per loop
> }}}
>
> AFTER:
>
> {{{
> sage: m = WordMorphism('a->aab,b->ba')
> sage: %timeit w = m('a'*100)
> 1000 loops, best of 3: 242 µs per loop
> }}}
New description:
Improve the creation of a word from a word when the parent changes :
BEFORE:
{{{
sage: w = Word('abab')
sage: P = WordPaths('abcd')
sage: P(w)
word: abab
sage: type(w)
<class 'sage.combinat.words.word.FiniteWord_str'>
sage: type(P(w))
<class 'sage.combinat.words.word.FiniteWord_str'>
}}}
AFTER:
{{{
sage: w = Word('abab')
sage: P = WordPaths('abcd')
sage: P(w)
Path: abab
sage: type(w)
<class 'sage.combinat.words.word.FiniteWord_str'>
sage: type(P(w))
<class 'sage.combinat.words.paths.FiniteWordPath_square_grid_str'>
}}}
The following construction gets also faster with the patch applied :
BEFORE:
{{{
sage: w = Word([0,1]*10000)
sage: %timeit z = Words([2,0,1])(w)
1000 loops, best of 3: 586 µs per loop
}}}
AFTER:
{{{
sage: w = Word([0,1]*10000)
sage: %timeit z = Words([2,0,1])(w)
1000 loops, best of 3: 343 µs per loop
}}}
--
Comment(by slabbe):
I just separated this ticket into three parts. It will make things easier
for the reviewer like that since the three parts were really independant.
See #8287 and #8289 for the issues that used to be discussed here.
--
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/7520#comment:9>
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.