mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Fix #17197: profile/cProfile modules refactored so that code of run() and runctx() utility functions is not duplicated in both modules.
This commit is contained in:
parent
d7c59e101f
commit
fca677a26a
3 changed files with 45 additions and 58 deletions
|
@ -7,54 +7,20 @@
|
||||||
__all__ = ["run", "runctx", "Profile"]
|
__all__ = ["run", "runctx", "Profile"]
|
||||||
|
|
||||||
import _lsprof
|
import _lsprof
|
||||||
|
import profile as _pyprofile
|
||||||
|
|
||||||
# ____________________________________________________________
|
# ____________________________________________________________
|
||||||
# Simple interface
|
# Simple interface
|
||||||
|
|
||||||
def run(statement, filename=None, sort=-1):
|
def run(statement, filename=None, sort=-1):
|
||||||
"""Run statement under profiler optionally saving results in filename
|
return _pyprofile._Utils(Profile).run(statement, filename, sort)
|
||||||
|
|
||||||
This function takes a single argument that can be passed to the
|
|
||||||
"exec" statement, and an optional file name. In all cases this
|
|
||||||
routine attempts to "exec" its first argument and gather profiling
|
|
||||||
statistics from the execution. If no file name is present, then this
|
|
||||||
function automatically prints a simple profiling report, sorted by the
|
|
||||||
standard name string (file/line/function-name) that is presented in
|
|
||||||
each line.
|
|
||||||
"""
|
|
||||||
prof = Profile()
|
|
||||||
result = None
|
|
||||||
try:
|
|
||||||
try:
|
|
||||||
prof = prof.run(statement)
|
|
||||||
except SystemExit:
|
|
||||||
pass
|
|
||||||
finally:
|
|
||||||
if filename is not None:
|
|
||||||
prof.dump_stats(filename)
|
|
||||||
else:
|
|
||||||
result = prof.print_stats(sort)
|
|
||||||
return result
|
|
||||||
|
|
||||||
def runctx(statement, globals, locals, filename=None, sort=-1):
|
def runctx(statement, globals, locals, filename=None, sort=-1):
|
||||||
"""Run statement under profiler, supplying your own globals and locals,
|
return _pyprofile._Utils(Profile).runctx(statement, globals, locals,
|
||||||
optionally saving results in filename.
|
filename, sort)
|
||||||
|
|
||||||
statement and filename have the same semantics as profile.run
|
run.__doc__ = _pyprofile.run.__doc__
|
||||||
"""
|
runctx.__doc__ = _pyprofile.runctx.__doc__
|
||||||
prof = Profile()
|
|
||||||
result = None
|
|
||||||
try:
|
|
||||||
try:
|
|
||||||
prof = prof.runctx(statement, globals, locals)
|
|
||||||
except SystemExit:
|
|
||||||
pass
|
|
||||||
finally:
|
|
||||||
if filename is not None:
|
|
||||||
prof.dump_stats(filename)
|
|
||||||
else:
|
|
||||||
result = prof.print_stats(sort)
|
|
||||||
return result
|
|
||||||
|
|
||||||
# ____________________________________________________________
|
# ____________________________________________________________
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,40 @@ __all__ = ["run", "runctx", "Profile"]
|
||||||
# return i_count
|
# return i_count
|
||||||
#itimes = integer_timer # replace with C coded timer returning integers
|
#itimes = integer_timer # replace with C coded timer returning integers
|
||||||
|
|
||||||
|
class _Utils:
|
||||||
|
"""Support class for utility functions which are shared by
|
||||||
|
profile.py and cProfile.py modules.
|
||||||
|
Not supposed to be used directly.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, profiler):
|
||||||
|
self.profiler = profiler
|
||||||
|
|
||||||
|
def run(self, statement, filename, sort):
|
||||||
|
prof = self.profiler()
|
||||||
|
try:
|
||||||
|
prof.run(statement)
|
||||||
|
except SystemExit:
|
||||||
|
pass
|
||||||
|
finally:
|
||||||
|
self._show(prof, filename, sort)
|
||||||
|
|
||||||
|
def runctx(self, statement, globals, locals, filename, sort):
|
||||||
|
prof = self.profiler()
|
||||||
|
try:
|
||||||
|
prof.runctx(statement, globals, locals)
|
||||||
|
except SystemExit:
|
||||||
|
pass
|
||||||
|
finally:
|
||||||
|
self._show(prof, filename, sort)
|
||||||
|
|
||||||
|
def _show(self, prof, filename, sort):
|
||||||
|
if filename is not None:
|
||||||
|
prof.dump_stats(filename)
|
||||||
|
else:
|
||||||
|
prof.print_stats(sort)
|
||||||
|
|
||||||
|
|
||||||
#**************************************************************************
|
#**************************************************************************
|
||||||
# The following are the static member functions for the profiler class
|
# The following are the static member functions for the profiler class
|
||||||
# Note that an instance of Profile() is *not* needed to call them.
|
# Note that an instance of Profile() is *not* needed to call them.
|
||||||
|
@ -56,15 +90,7 @@ def run(statement, filename=None, sort=-1):
|
||||||
standard name string (file/line/function-name) that is presented in
|
standard name string (file/line/function-name) that is presented in
|
||||||
each line.
|
each line.
|
||||||
"""
|
"""
|
||||||
prof = Profile()
|
return _Utils(Profile).run(statement, filename, sort)
|
||||||
try:
|
|
||||||
prof = prof.run(statement)
|
|
||||||
except SystemExit:
|
|
||||||
pass
|
|
||||||
if filename is not None:
|
|
||||||
prof.dump_stats(filename)
|
|
||||||
else:
|
|
||||||
return prof.print_stats(sort)
|
|
||||||
|
|
||||||
def runctx(statement, globals, locals, filename=None, sort=-1):
|
def runctx(statement, globals, locals, filename=None, sort=-1):
|
||||||
"""Run statement under profiler, supplying your own globals and locals,
|
"""Run statement under profiler, supplying your own globals and locals,
|
||||||
|
@ -72,16 +98,8 @@ def runctx(statement, globals, locals, filename=None, sort=-1):
|
||||||
|
|
||||||
statement and filename have the same semantics as profile.run
|
statement and filename have the same semantics as profile.run
|
||||||
"""
|
"""
|
||||||
prof = Profile()
|
return _Utils(Profile).runctx(statement, globals, locals, filename, sort)
|
||||||
try:
|
|
||||||
prof = prof.runctx(statement, globals, locals)
|
|
||||||
except SystemExit:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if filename is not None:
|
|
||||||
prof.dump_stats(filename)
|
|
||||||
else:
|
|
||||||
return prof.print_stats(sort)
|
|
||||||
|
|
||||||
class Profile:
|
class Profile:
|
||||||
"""Profiler class.
|
"""Profiler class.
|
||||||
|
|
|
@ -263,6 +263,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #17197: profile/cProfile modules refactored so that code of run() and
|
||||||
|
runctx() utility functions is not duplicated in both modules.
|
||||||
|
|
||||||
- Issue #14720: sqlite3: Convert datetime microseconds correctly.
|
- Issue #14720: sqlite3: Convert datetime microseconds correctly.
|
||||||
Patch by Lowe Thiderman.
|
Patch by Lowe Thiderman.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue