|
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)
|