Blame tests/run/pstats_profile_test.pyx

Packit 562c7a
# tag: pstats
Packit 562c7a
# cython: profile = True
Packit 562c7a
Packit 562c7a
__doc__ = u"""
Packit 562c7a
    >>> import os, tempfile, cProfile as profile, pstats
Packit 562c7a
    >>> statsfile = tempfile.mkstemp()[1]
Packit 562c7a
    >>> profile.runctx("test_profile(100)", locals(), globals(), statsfile)
Packit 562c7a
    >>> s = pstats.Stats(statsfile)
Packit 562c7a
    >>> short_stats = dict([(k[2], v[1]) for k,v in s.stats.items()])
Packit 562c7a
    >>> short_stats['f_def']
Packit 562c7a
    100
Packit 562c7a
    >>> short_stats['f_cdef']
Packit 562c7a
    100
Packit 562c7a
    >>> short_stats['f_cpdef']
Packit 562c7a
    200
Packit 562c7a
    >>> short_stats['f_cpdef (wrapper)']
Packit 562c7a
    100
Packit 562c7a
    >>> short_stats['f_inline']
Packit 562c7a
    100
Packit 562c7a
    >>> short_stats['f_inline_prof']
Packit 562c7a
    100
Packit 562c7a
    >>> short_stats['f_noprof']
Packit 562c7a
    Traceback (most recent call last):
Packit 562c7a
    ...
Packit 562c7a
    KeyError: 'f_noprof'
Packit 562c7a
    >>> short_stats['f_raise']
Packit 562c7a
    100
Packit 562c7a
Packit 562c7a
    >>> short_stats['withgil_prof']
Packit 562c7a
    100
Packit 562c7a
    >>> short_stats['withgil_noprof']
Packit 562c7a
    Traceback (most recent call last):
Packit 562c7a
    ...
Packit 562c7a
    KeyError: 'withgil_noprof'
Packit 562c7a
Packit 562c7a
    >>> short_stats['nogil_prof']
Packit 562c7a
    Traceback (most recent call last):
Packit 562c7a
    ...
Packit 562c7a
    KeyError: 'nogil_prof'
Packit 562c7a
    >>> short_stats['nogil_noprof']
Packit 562c7a
    Traceback (most recent call last):
Packit 562c7a
    ...
Packit 562c7a
    KeyError: 'nogil_noprof'
Packit 562c7a
Packit 562c7a
    >>> short_stats['f_raise']
Packit 562c7a
    100
Packit 562c7a
Packit 562c7a
    >>> short_stats['m_def']
Packit 562c7a
    200
Packit 562c7a
    >>> short_stats['m_cdef']
Packit 562c7a
    100
Packit 562c7a
    >>> short_stats['m_cpdef']
Packit 562c7a
    200
Packit 562c7a
    >>> short_stats['m_cpdef (wrapper)']
Packit 562c7a
    100
Packit 562c7a
Packit 562c7a
    >>> try:
Packit 562c7a
    ...    os.unlink(statsfile)
Packit 562c7a
    ... except:
Packit 562c7a
    ...    pass
Packit 562c7a
Packit 562c7a
    >>> sorted(callees(s, 'test_profile'))  #doctest: +NORMALIZE_WHITESPACE
Packit 562c7a
    ['f_cdef', 'f_cpdef', 'f_cpdef (wrapper)', 'f_def',
Packit 562c7a
     'f_inline', 'f_inline_prof',
Packit 562c7a
     'f_raise',
Packit 562c7a
     'm_cdef', 'm_cpdef', 'm_cpdef (wrapper)', 'm_def',
Packit 562c7a
     'withgil_prof']
Packit 562c7a
Packit 562c7a
    >>> profile.runctx("test_generators()", locals(), globals(), statsfile)
Packit 562c7a
    >>> s = pstats.Stats(statsfile)
Packit 562c7a
    >>> short_stats = dict([(k[2], v[1]) for k,v in s.stats.items()])
Packit 562c7a
    >>> short_stats['generator']
Packit 562c7a
    3
Packit 562c7a
Packit 562c7a
    >>> short_stats['generator_exception']
Packit 562c7a
    2
Packit 562c7a
Packit 562c7a
    >>> short_stats['genexpr']
Packit 562c7a
    11
Packit 562c7a
Packit 562c7a
    >>> sorted(callees(s, 'test_generators'))
Packit 562c7a
    ['call_generator', 'call_generator_exception', 'generator_expr']
Packit 562c7a
Packit 562c7a
    >>> list(callees(s, 'call_generator'))
Packit 562c7a
    ['generator']
Packit 562c7a
Packit 562c7a
    >>> list(callees(s, 'generator'))
Packit 562c7a
    []
Packit 562c7a
Packit 562c7a
    >>> list(callees(s, 'generator_exception'))
Packit 562c7a
    []
Packit 562c7a
Packit 562c7a
    >>> list(callees(s, 'generator_expr'))
Packit 562c7a
    ['genexpr']
Packit 562c7a
Packit 562c7a
    >>> list(callees(s, 'genexpr'))
Packit 562c7a
    []
Packit 562c7a
Packit 562c7a
    >>> def python_generator():
Packit 562c7a
    ...   yield 1
Packit 562c7a
    ...   yield 2
Packit 562c7a
    >>> def call_python_generator():
Packit 562c7a
    ...   list(python_generator())
Packit 562c7a
Packit 562c7a
    >>> profile.runctx("call_python_generator()", locals(), globals(), statsfile)
Packit 562c7a
    >>> python_stats = pstats.Stats(statsfile)
Packit 562c7a
    >>> python_stats_dict = dict([(k[2], v[1]) for k,v in python_stats.stats.items()])
Packit 562c7a
Packit 562c7a
    >>> profile.runctx("call_generator()", locals(), globals(), statsfile)
Packit 562c7a
    >>> cython_stats = pstats.Stats(statsfile)
Packit 562c7a
    >>> cython_stats_dict = dict([(k[2], v[1]) for k,v in cython_stats.stats.items()])
Packit 562c7a
Packit 562c7a
    >>> python_stats_dict['python_generator'] == cython_stats_dict['generator']
Packit 562c7a
    True
Packit 562c7a
Packit 562c7a
    >>> try:
Packit 562c7a
    ...    os.unlink(statsfile)
Packit 562c7a
    ... except:
Packit 562c7a
    ...    pass
Packit 562c7a
"""
Packit 562c7a
Packit 562c7a
cimport cython
Packit 562c7a
Packit 562c7a
def callees(pstats, target_caller):
Packit 562c7a
    pstats.calc_callees()
Packit 562c7a
    for (_, _, caller), callees in pstats.all_callees.items():
Packit 562c7a
      if caller == target_caller:
Packit 562c7a
        for (file, line, callee) in callees.keys():
Packit 562c7a
            if 'pyx' in file:
Packit 562c7a
                yield callee
Packit 562c7a
Packit 562c7a
def test_profile(long N):
Packit 562c7a
    cdef long i, n = 0
Packit 562c7a
    cdef A a = A()
Packit 562c7a
    for i from 0 <= i < N:
Packit 562c7a
        n += f_def(i)
Packit 562c7a
        n += f_cdef(i)
Packit 562c7a
        n += f_cpdef(i)
Packit 562c7a
        n += (<object>f_cpdef)(i)
Packit 562c7a
        n += f_inline(i)
Packit 562c7a
        n += f_inline_prof(i)
Packit 562c7a
        n += f_noprof(i)
Packit 562c7a
        n += nogil_noprof(i)
Packit 562c7a
        n += nogil_prof(i)
Packit 562c7a
        n += withgil_noprof(i)
Packit 562c7a
        n += withgil_prof(i)
Packit 562c7a
        n += a.m_def(i)
Packit 562c7a
        n += (<object>a).m_def(i)
Packit 562c7a
        n += a.m_cpdef(i)
Packit 562c7a
        n += (<object>a).m_cpdef(i)
Packit 562c7a
        n += a.m_cdef(i)
Packit 562c7a
        try:
Packit 562c7a
            n += f_raise(i+2)
Packit 562c7a
        except RuntimeError:
Packit 562c7a
            pass
Packit 562c7a
    return n
Packit 562c7a
Packit 562c7a
def f_def(long a):
Packit 562c7a
    return a
Packit 562c7a
Packit 562c7a
cdef long f_cdef(long a):
Packit 562c7a
    return a
Packit 562c7a
Packit 562c7a
cpdef long f_cpdef(long a):
Packit 562c7a
    return a
Packit 562c7a
Packit 562c7a
cdef inline long f_inline(long a):
Packit 562c7a
    return a
Packit 562c7a
Packit 562c7a
@cython.profile(True)
Packit 562c7a
cdef inline long f_inline_prof(long a):
Packit 562c7a
    return a
Packit 562c7a
Packit 562c7a
@cython.profile(False)
Packit 562c7a
cdef int f_noprof(long a):
Packit 562c7a
    return a
Packit 562c7a
Packit 562c7a
cdef long f_raise(long) except -2:
Packit 562c7a
    raise RuntimeError
Packit 562c7a
Packit 562c7a
@cython.profile(False)
Packit 562c7a
cdef int withgil_noprof(long a) with gil:
Packit 562c7a
    return (a)
Packit 562c7a
@cython.profile(True)
Packit 562c7a
cdef int withgil_prof(long a) with gil:
Packit 562c7a
    return (a)
Packit 562c7a
Packit 562c7a
@cython.profile(False)
Packit 562c7a
cdef int nogil_noprof(long a) nogil:
Packit 562c7a
    return a
Packit 562c7a
@cython.profile(True)
Packit 562c7a
cdef int nogil_prof(long a) nogil:
Packit 562c7a
    return a
Packit 562c7a
Packit 562c7a
cdef class A(object):
Packit 562c7a
    def m_def(self, long a):
Packit 562c7a
        return a
Packit 562c7a
    cpdef m_cpdef(self, long a):
Packit 562c7a
        return a
Packit 562c7a
    cdef m_cdef(self, long a):
Packit 562c7a
        return a
Packit 562c7a
Packit 562c7a
def test_generators():
Packit 562c7a
    call_generator()
Packit 562c7a
    call_generator_exception()
Packit 562c7a
    generator_expr()
Packit 562c7a
Packit 562c7a
def call_generator():
Packit 562c7a
    list(generator())
Packit 562c7a
Packit 562c7a
def generator():
Packit 562c7a
    yield 1
Packit 562c7a
    yield 2
Packit 562c7a
Packit 562c7a
def call_generator_exception():
Packit 562c7a
    try:
Packit 562c7a
        list(generator_exception())
Packit 562c7a
    except ValueError:
Packit 562c7a
        pass
Packit 562c7a
Packit 562c7a
def generator_exception():
Packit 562c7a
    yield 1
Packit 562c7a
    raise ValueError(2)
Packit 562c7a
Packit 562c7a
def generator_expr():
Packit 562c7a
    e = (x for x in range(10))
Packit 562c7a
    return sum(e)