summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2019-09-02 19:24:23 +0200
committerStefan Behnel <stefan_ml@behnel.de>2019-11-07 19:24:45 +0100
commit999e49186534ad6ccc350c506d3eb8e5c7ef2b77 (patch)
tree2624637573f8273e4b77837d1ca025622ef98e9b
parentb75c7dd085fe06400c38e550d25e4db7b8d696b2 (diff)
downloadcython-999e49186534ad6ccc350c506d3eb8e5c7ef2b77.tar.gz
Create copy of test with "binding" directive disabled.
-rw-r--r--tests/run/pstats_profile_test_pycfunc.pyx228
1 files changed, 228 insertions, 0 deletions
diff --git a/tests/run/pstats_profile_test_pycfunc.pyx b/tests/run/pstats_profile_test_pycfunc.pyx
new file mode 100644
index 000000000..717811082
--- /dev/null
+++ b/tests/run/pstats_profile_test_pycfunc.pyx
@@ -0,0 +1,228 @@
+# tag: pstats
+# cython: profile = True
+# cython: binding = False
+
+__doc__ = u"""
+ >>> import os, tempfile, cProfile as profile, pstats
+ >>> statsfile = tempfile.mkstemp()[1]
+ >>> profile.runctx("test_profile(100)", locals(), globals(), statsfile)
+ >>> s = pstats.Stats(statsfile)
+ >>> short_stats = dict([(k[2], v[1]) for k,v in s.stats.items()])
+ >>> short_stats['f_def']
+ 100
+ >>> short_stats['f_cdef']
+ 100
+ >>> short_stats['f_cpdef']
+ 200
+ >>> short_stats['f_cpdef (wrapper)']
+ 100
+ >>> short_stats['f_inline']
+ 100
+ >>> short_stats['f_inline_prof']
+ 100
+ >>> short_stats['f_noprof']
+ Traceback (most recent call last):
+ ...
+ KeyError: 'f_noprof'
+ >>> short_stats['f_raise']
+ 100
+
+ >>> short_stats['withgil_prof']
+ 100
+ >>> short_stats['withgil_noprof']
+ Traceback (most recent call last):
+ ...
+ KeyError: 'withgil_noprof'
+
+ >>> short_stats['nogil_prof']
+ Traceback (most recent call last):
+ ...
+ KeyError: 'nogil_prof'
+ >>> short_stats['nogil_noprof']
+ Traceback (most recent call last):
+ ...
+ KeyError: 'nogil_noprof'
+
+ >>> short_stats['f_raise']
+ 100
+
+ >>> short_stats['m_def']
+ 200
+ >>> short_stats['m_cdef']
+ 100
+ >>> short_stats['m_cpdef']
+ 200
+ >>> short_stats['m_cpdef (wrapper)']
+ 100
+
+ >>> try:
+ ... os.unlink(statsfile)
+ ... except:
+ ... pass
+
+ >>> sorted(callees(s, 'test_profile')) #doctest: +NORMALIZE_WHITESPACE
+ ['f_cdef', 'f_cpdef', 'f_cpdef (wrapper)', 'f_def',
+ 'f_inline', 'f_inline_prof',
+ 'f_raise',
+ 'm_cdef', 'm_cpdef', 'm_cpdef (wrapper)', 'm_def',
+ 'withgil_prof']
+
+ >>> profile.runctx("test_generators()", locals(), globals(), statsfile)
+ >>> s = pstats.Stats(statsfile)
+ >>> short_stats = dict([(k[2], v[1]) for k,v in s.stats.items()])
+ >>> short_stats['generator']
+ 3
+
+ >>> short_stats['generator_exception']
+ 2
+
+ >>> short_stats['genexpr']
+ 11
+
+ >>> sorted(callees(s, 'test_generators'))
+ ['call_generator', 'call_generator_exception', 'generator_expr']
+
+ >>> list(callees(s, 'call_generator'))
+ ['generator']
+
+ >>> list(callees(s, 'generator'))
+ []
+
+ >>> list(callees(s, 'generator_exception'))
+ []
+
+ >>> list(callees(s, 'generator_expr'))
+ ['genexpr']
+
+ >>> list(callees(s, 'genexpr'))
+ []
+
+ >>> def python_generator():
+ ... yield 1
+ ... yield 2
+ >>> def call_python_generator():
+ ... list(python_generator())
+
+ >>> profile.runctx("call_python_generator()", locals(), globals(), statsfile)
+ >>> python_stats = pstats.Stats(statsfile)
+ >>> python_stats_dict = dict([(k[2], v[1]) for k,v in python_stats.stats.items()])
+
+ >>> profile.runctx("call_generator()", locals(), globals(), statsfile)
+ >>> cython_stats = pstats.Stats(statsfile)
+ >>> cython_stats_dict = dict([(k[2], v[1]) for k,v in cython_stats.stats.items()])
+
+ >>> python_stats_dict['python_generator'] == cython_stats_dict['generator']
+ True
+
+ >>> try:
+ ... os.unlink(statsfile)
+ ... except:
+ ... pass
+"""
+
+cimport cython
+
+def callees(pstats, target_caller):
+ pstats.calc_callees()
+ for (_, _, caller), callees in pstats.all_callees.items():
+ if caller == target_caller:
+ for (file, line, callee) in callees.keys():
+ if 'pyx' in file:
+ yield callee
+
+def test_profile(long N):
+ cdef long i, n = 0
+ cdef A a = A()
+ for i from 0 <= i < N:
+ n += f_def(i)
+ n += f_cdef(i)
+ n += f_cpdef(i)
+ n += (<object>f_cpdef)(i)
+ n += f_inline(i)
+ n += f_inline_prof(i)
+ n += f_noprof(i)
+ n += nogil_noprof(i)
+ n += nogil_prof(i)
+ n += withgil_noprof(i)
+ n += withgil_prof(i)
+ n += a.m_def(i)
+ n += (<object>a).m_def(i)
+ n += a.m_cpdef(i)
+ n += (<object>a).m_cpdef(i)
+ n += a.m_cdef(i)
+ try:
+ n += f_raise(i+2)
+ except RuntimeError:
+ pass
+ return n
+
+def f_def(long a):
+ return a
+
+cdef long f_cdef(long a):
+ return a
+
+cpdef long f_cpdef(long a):
+ return a
+
+cdef inline long f_inline(long a):
+ return a
+
+@cython.profile(True)
+cdef inline long f_inline_prof(long a):
+ return a
+
+@cython.profile(False)
+cdef int f_noprof(long a):
+ return a
+
+cdef long f_raise(long) except -2:
+ raise RuntimeError
+
+@cython.profile(False)
+cdef int withgil_noprof(long a) with gil:
+ return (a)
+@cython.profile(True)
+cdef int withgil_prof(long a) with gil:
+ return (a)
+
+@cython.profile(False)
+cdef int nogil_noprof(long a) nogil:
+ return a
+@cython.profile(True)
+cdef int nogil_prof(long a) nogil:
+ return a
+
+cdef class A(object):
+ def m_def(self, long a):
+ return a
+ cpdef m_cpdef(self, long a):
+ return a
+ cdef m_cdef(self, long a):
+ return a
+
+def test_generators():
+ call_generator()
+ call_generator_exception()
+ generator_expr()
+
+def call_generator():
+ list(generator())
+
+def generator():
+ yield 1
+ yield 2
+
+def call_generator_exception():
+ try:
+ list(generator_exception())
+ except ValueError:
+ pass
+
+def generator_exception():
+ yield 1
+ raise ValueError(2)
+
+def generator_expr():
+ e = (x for x in range(10))
+ return sum(e)