#14159: Don't install callbacks on values of TripleDict, MonoDict
------------------------------+---------------------------------------------
       Reporter:  nbruin      |         Owner:  tbd         
           Type:  defect      |        Status:  needs_review
       Priority:  major       |     Milestone:  sage-5.8    
      Component:  memleak     |    Resolution:              
       Keywords:              |   Work issues:              
Report Upstream:  N/A         |     Reviewers:  Nils Bruin  
        Authors:  Simon King  |     Merged in:              
   Dependencies:  #13387      |      Stopgaps:              
------------------------------+---------------------------------------------

Comment (by SimonKing):

 Some other timings, making set/get cpdef:
 {{{
 sage: from sage.structure.coerce_dict import TripleDict, MonoDict
 sage: R = [Integers(n) for n in range(1,10^4)]
 sage: T = TripleDict(53)
 sage: M = MonoDict(53)
 sage: def test_py_getitem(T,R):
     for x in R:
         T[R,R,R] = 1
     for x in R:
         _ = T[R,R,R]
 ....:
 sage: def test_py_get(T,R):
     for x in R:
         T.set(R,R,R, 1)
     for x in R:
         _ = T.get(R,R,R)
 ....:
 sage: cython("""
 from sage.structure.coerce_dict cimport TripleDict
 def test_cy_getitem(TripleDict T,R):
     for x in R:
         T[R,R,R] = 1
     for x in R:
         _ = T[R,R,R]
 """)
 ....:
 sage: cython("""
 from sage.structure.coerce_dict cimport TripleDict
 def test_cy_get(TripleDict T,R):
     for x in R:
         T.set(R,R,R, 1)
     for x in R:
         _ = T.get(R,R,R)
 """)
 ....:
 sage: %time test_py_getitem(T,R)
 CPU times: user 0.03 s, sys: 0.01 s, total: 0.04 s
 Wall time: 0.04 s
 sage: %timeit test_py_getitem(T,R)
 10 loops, best of 3: 23.9 ms per loop
 sage: %timeit test_py_getitem(T,R)
 10 loops, best of 3: 23.5 ms per loop
 sage: %timeit test_py_getitem(T,R)
 10 loops, best of 3: 23.6 ms per loop
 sage: %timeit test_py_get(T,R)
 10 loops, best of 3: 24.6 ms per loop
 sage: %timeit test_py_get(T,R)
 10 loops, best of 3: 24.3 ms per loop
 sage: %timeit test_py_get(T,R)
 10 loops, best of 3: 24.3 ms per loop
 sage: %timeit test_cy_getitem(T,R)
 10 loops, best of 3: 19.9 ms per loop
 sage: %timeit test_cy_getitem(T,R)
 100 loops, best of 3: 19.9 ms per loop
 sage: %timeit test_cy_getitem(T,R)
 100 loops, best of 3: 19.6 ms per loop
 sage: %timeit test_cy_get(T,R)
 100 loops, best of 3: 17.9 ms per loop
 sage: %timeit test_cy_get(T,R)
 100 loops, best of 3: 18 ms per loop
 sage: %timeit test_cy_get(T,R)
 100 loops, best of 3: 18.3 ms per loop
 }}}

 Hence, I can confirm that in Python one better relies on the magical
 methods, while in cython it is better (but not ''much'' better!) to use
 the cpdef methods.

 But in fact, I found some spots in parent_old.pyx that *are* used and call
 the magical methods.

-- 
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/14159#comment:44>
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?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to