From 1eb4bfc6579133c2d7a495141b1f754dfecf0fc6 Mon Sep 17 00:00:00 2001 From: Nicholas Bastin Date: Mon, 22 Mar 2004 20:12:56 +0000 Subject: Added global runctx function to profile to fix SF Bug #716587 --- Doc/lib/libprofile.tex | 8 +++++++- Lib/profile.py | 17 +++++++++++++++++ Lib/test/output/test_profile | 12 ++++++------ Lib/test/test_profile.py | 14 ++++++++++++++ Misc/NEWS | 2 ++ 5 files changed, 46 insertions(+), 7 deletions(-) diff --git a/Doc/lib/libprofile.tex b/Doc/lib/libprofile.tex index 4d62094..608e1cd 100644 --- a/Doc/lib/libprofile.tex +++ b/Doc/lib/libprofile.tex @@ -275,7 +275,7 @@ Profiler Extensions, which includes discussion of how to derive ``better'' profilers from the classes presented, or reading the source code for these modules. -\begin{funcdesc}{run}{string\optional{, filename\optional{, ...}}} +\begin{funcdesc}{run}{command\optional{, filename}} This function takes a single argument that has can be passed to the \keyword{exec} statement, and an optional file name. In all cases this @@ -339,6 +339,12 @@ figure is printed. \end{funcdesc} +\begin{funcdesc}{runctx}{command, globals, locals\optional{, filename}} +This function is similar to \function{profile.run()}, with added +arguments to supply the globals and locals dictionaries for the +\var{command} string. +\end{funcdesc} + Analysis of the profiler data is done using this class from the \module{pstats} module: diff --git a/Lib/profile.py b/Lib/profile.py index 2dc6e87..1a4ff67 100755 --- a/Lib/profile.py +++ b/Lib/profile.py @@ -76,6 +76,23 @@ def run(statement, filename=None): else: return prof.print_stats() +def runctx(statement, globals, locals, filename=None): + """Run statement under profiler, supplying your own globals and locals, + optionally saving results in filename. + + statement and filename have the same semantics as profile.run + """ + prof = Profile() + try: + prof = prof.runctx(statement, globals, locals) + except SystemExit: + pass + + if filename is not None: + prof.dump_stats(filename) + else: + return prof.print_stats() + # print help def help(): for dirname in sys.path: diff --git a/Lib/test/output/test_profile b/Lib/test/output/test_profile index b36a016..917a18e 100644 --- a/Lib/test/output/test_profile +++ b/Lib/test/output/test_profile @@ -7,11 +7,11 @@ test_profile 1 0.000 0.000 1.000 1.000 :1(?) 0 0.000 0.000 profile:0(profiler) 1 0.000 0.000 1.000 1.000 profile:0(testfunc()) - 1 0.400 0.400 1.000 1.000 test_profile.py:21(testfunc) - 2 0.080 0.040 0.600 0.300 test_profile.py:30(helper) - 4 0.116 0.029 0.120 0.030 test_profile.py:48(helper1) - 8 0.312 0.039 0.400 0.050 test_profile.py:56(helper2) - 8 0.064 0.008 0.080 0.010 test_profile.py:66(subhelper) - 28 0.028 0.001 0.028 0.001 test_profile.py:78(__getattr__) + 1 0.400 0.400 1.000 1.000 test_profile.py:23(testfunc) + 2 0.080 0.040 0.600 0.300 test_profile.py:32(helper) + 4 0.116 0.029 0.120 0.030 test_profile.py:50(helper1) + 8 0.312 0.039 0.400 0.050 test_profile.py:58(helper2) + 8 0.064 0.008 0.080 0.010 test_profile.py:68(subhelper) + 28 0.028 0.001 0.028 0.001 test_profile.py:80(__getattr__) diff --git a/Lib/test/test_profile.py b/Lib/test/test_profile.py index 6ff5811..1b1f50b 100644 --- a/Lib/test/test_profile.py +++ b/Lib/test/test_profile.py @@ -1,6 +1,8 @@ """Test suite for the profile module.""" import profile +import os +from test.test_support import TESTFN, vereq # In order to have reproducible time, we simulate a timer in the global # variable 'ticks', which represents simulated time in milliseconds. @@ -82,5 +84,17 @@ class C: ticks += 1 raise AttributeError + +def test_2(): + d = globals().copy() + def testfunc(): + global x + x = 1 + d['testfunc'] = testfunc + profile.runctx("testfunc()", d, d, TESTFN) + vereq (x, 1) + os.unlink (TESTFN) + if __name__ == "__main__": test_main() + test_2() diff --git a/Misc/NEWS b/Misc/NEWS index a1655e7..50c5249 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -290,6 +290,8 @@ Extension modules Library ------- +- Added global runctx function to profile module + - Add hlist missing entryconfigure and entrycget methods. - The ptcp154 codec was added for Kazakh character set support. -- cgit v0.12