Performance Test for Clone Protocol - Parents and Elements

Skip to content
Back to top
View this page
Edit this page

# Performance Test for Clone Protocol

see `sage.structure.list_clone.ClonableArray`

EXAMPLES:

Sage

    sage: from sage.structure.list_clone_timings import *
    sage: cmd =["",
    ....:     "e.__copy__()",
    ....:     "copy(e)",
    ....:     "e.clone()",
    ....:     "e.__class__(e.parent(), e._get_list())",
    ....:     "e.__class__(e.parent(), e[:])",
    ....:     "e.check()",
    ....:     "",
    ....:     "add1_internal(e)",
    ....:     "add1_immutable(e)",
    ....:     "add1_mutable(e)",
    ....:     "add1_with(e)",
    ....:     "",
    ....:     "cy_add1_internal(e)",
    ....:     "cy_add1_immutable(e)",
    ....:     "cy_add1_mutable(e)",
    ....:     "cy_add1_with(e)"]

Python

    >>> from sage.all import *
    >>> from sage.structure.list_clone_timings import *
    >>> cmd =["",
    ...     "e.__copy__()",
    ...     "copy(e)",
    ...     "e.clone()",
    ...     "e.__class__(e.parent(), e._get_list())",
    ...     "e.__class__(e.parent(), e[:])",
    ...     "e.check()",
    ...     "",
    ...     "add1_internal(e)",
    ...     "add1_immutable(e)",
    ...     "add1_mutable(e)",
    ...     "add1_with(e)",
    ...     "",
    ...     "cy_add1_internal(e)",
    ...     "cy_add1_immutable(e)",
    ...     "cy_add1_mutable(e)",
    ...     "cy_add1_with(e)"]

Various timings using a Cython class:

Sage

    sage: size = 5
    sage: e = IncreasingArrays()(range(size))
    sage: # random
    ....: for p in cmd:
    ....:     print("{0:36} : ".format(p), end=""); timeit(p)
                                         :
    e.__copy__()                         :  625 loops, best of 3: 446 ns per loop
    copy(e)                              :  625 loops, best of 3: 1.94 µs per loop
    e.clone()                            :  625 loops, best of 3: 736 ns per loop
    e.__class__(e.parent(), e._get_list()) :  625 loops, best of 3: 1.34 µs per loop
    e.__class__(e.parent(), e[:])        :  625 loops, best of 3: 1.35 µs per loop
    e.check()                            :  625 loops, best of 3: 342 ns per loop
                                         :
    add1_internal(e)                     :  625 loops, best of 3: 3.53 µs per loop
    add1_immutable(e)                    :  625 loops, best of 3: 3.72 µs per loop
    add1_mutable(e)                      :  625 loops, best of 3: 3.42 µs per loop
    add1_with(e)                         :  625 loops, best of 3: 4.05 µs per loop
                                         :
    cy_add1_internal(e)                  :  625 loops, best of 3: 752 ns per loop
    cy_add1_immutable(e)                 :  625 loops, best of 3: 1.28 µs per loop
    cy_add1_mutable(e)                   :  625 loops, best of 3: 861 ns per loop
    cy_add1_with(e)                      :  625 loops, best of 3: 1.51 µs per loop

[Python]

    >>> from sage.all import *
    >>> size = Integer(5)
    >>> e = IncreasingArrays()(range(size))
    >>> # random
    ... for p in cmd:
    ...     print("{0:36} : ".format(p), end=""); timeit(p)
                                         :
    e.__copy__()                         :  625 loops, best of 3: 446 ns per loop
    copy(e)                              :  625 loops, best of 3: 1.94 µs per loop
    e.clone()                            :  625 loops, best of 3: 736 ns per loop
    e.__class__(e.parent(), e._get_list()) :  625 loops, best of 3: 1.34 µs per loop
    e.__class__(e.parent(), e[:])        :  625 loops, best of 3: 1.35 µs per loop
    e.check()                            :  625 loops, best of 3: 342 ns per loop
                                         :
    add1_internal(e)                     :  625 loops, best of 3: 3.53 µs per loop
    add1_immutable(e)                    :  625 loops, best of 3: 3.72 µs per loop
    add1_mutable(e)                      :  625 loops, best of 3: 3.42 µs per loop
    add1_with(e)                         :  625 loops, best of 3: 4.05 µs per loop
                                         :
    cy_add1_internal(e)                  :  625 loops, best of 3: 752 ns per loop
    cy_add1_immutable(e)                 :  625 loops, best of 3: 1.28 µs per loop
    cy_add1_mutable(e)                   :  625 loops, best of 3: 861 ns per loop
    cy_add1_with(e)                      :  625 loops, best of 3: 1.51 µs per loop

Various timings using a Python class:

Sage

    sage: e = IncreasingArraysPy()(range(size))
    sage: # random
    ....: for p in cmd: print("{0:36} : ".format(p), end=""); timeit(p)
                                         :
    e.__copy__()                         :  625 loops, best of 3: 869 ns per loop
    copy(e)                              :  625 loops, best of 3: 2.13 µs per loop
    e.clone()                            :  625 loops, best of 3: 1.86 µs per loop
    e.__class__(e.parent(), e._get_list()) :  625 loops, best of 3: 7.52 µs per loop
    e.__class__(e.parent(), e[:])        :  625 loops, best of 3: 7.27 µs per loop
    e.check()                            :  625 loops, best of 3: 4.02 µs per loop
                                         :
    add1_internal(e)                     :  625 loops, best of 3: 9.34 µs per loop
    add1_immutable(e)                    :  625 loops, best of 3: 9.91 µs per loop
    add1_mutable(e)                      :  625 loops, best of 3: 12.6 µs per loop
    add1_with(e)                         :  625 loops, best of 3: 15.9 µs per loop
                                         :
    cy_add1_internal(e)                  :  625 loops, best of 3: 7.13 µs per loop
    cy_add1_immutable(e)                 :  625 loops, best of 3: 6.95 µs per loop
    cy_add1_mutable(e)                   :  625 loops, best of 3: 14.1 µs per loop
    cy_add1_with(e)                      :  625 loops, best of 3: 17.5 µs per loop

Python

    >>> from sage.all import *
    >>> e = IncreasingArraysPy()(range(size))
    >>> # random
    ... for p in cmd: print("{0:36} : ".format(p), end=""); timeit(p)
                                         :
    e.__copy__()                         :  625 loops, best of 3: 869 ns per loop
    copy(e)                              :  625 loops, best of 3: 2.13 µs per loop
    e.clone()                            :  625 loops, best of 3: 1.86 µs per loop
    e.__class__(e.parent(), e._get_list()) :  625 loops, best of 3: 7.52 µs per loop
    e.__class__(e.parent(), e[:])        :  625 loops, best of 3: 7.27 µs per loop
    e.check()                            :  625 loops, best of 3: 4.02 µs per loop
                                         :
    add1_internal(e)                     :  625 loops, best of 3: 9.34 µs per loop
    add1_immutable(e)                    :  625 loops, best of 3: 9.91 µs per loop
    add1_mutable(e)                      :  625 loops, best of 3: 12.6 µs per loop
    add1_with(e)                         :  625 loops, best of 3: 15.9 µs per loop
                                         :
    cy_add1_internal(e)                  :  625 loops, best of 3: 7.13 µs per loop
    cy_add1_immutable(e)                 :  625 loops, best of 3: 6.95 µs per loop
    cy_add1_mutable(e)                   :  625 loops, best of 3: 14.1 µs per loop
    cy_add1_with(e)                      :  625 loops, best of 3: 17.5 µs per loop

class sage.structure.list_clone_timings.IncreasingArraysPy

  Bases: `IncreasingArrays`

  class Element

    Bases: `ClonableArray`

    A small class for testing `ClonableArray`: Increasing Lists.

    check()

      Check that `self` is increasing.

      EXAMPLES:

      Sage

          sage: from sage.structure.list_clone_timings import IncreasingArraysPy
          sage: IncreasingArraysPy()([1,2,3]) # indirect doctest
          [1, 2, 3]
          sage: IncreasingArraysPy()([3,2,1]) # indirect doctest
          Traceback (most recent call last):
          ...
          ValueError: Lists is not increasing

      Python

          >>> from sage.all import *
          >>> from sage.structure.list_clone_timings import IncreasingArraysPy
          >>> IncreasingArraysPy()([Integer(1),Integer(2),Integer(3)]) # indirect doctest
          [1, 2, 3]
          >>> IncreasingArraysPy()([Integer(3),Integer(2),Integer(1)]) # indirect doctest
          Traceback (most recent call last):
          ...
          ValueError: Lists is not increasing

sage.structure.list_clone_timings.add1_immutable(bla)

sage.structure.list_clone_timings.add1_internal(bla)

sage.structure.list_clone_timings.add1_mutable(bla)

sage.structure.list_clone_timings.add1_with(bla)