diff options
author | Nicholas Bastin <nick.bastin@gmail.com> | 2004-03-22 20:12:56 (GMT) |
---|---|---|
committer | Nicholas Bastin <nick.bastin@gmail.com> | 2004-03-22 20:12:56 (GMT) |
commit | 1eb4bfc6579133c2d7a495141b1f754dfecf0fc6 (patch) | |
tree | ebdd1801beda401932abd45966cc052e461d74fc | |
parent | 706933821c88508299a292e8bb20bf22a9f6364b (diff) | |
download | cpython-1eb4bfc6579133c2d7a495141b1f754dfecf0fc6.zip cpython-1eb4bfc6579133c2d7a495141b1f754dfecf0fc6.tar.gz cpython-1eb4bfc6579133c2d7a495141b1f754dfecf0fc6.tar.bz2 |
Added global runctx function to profile to fix SF Bug #716587
-rw-r--r-- | Doc/lib/libprofile.tex | 8 | ||||
-rwxr-xr-x | Lib/profile.py | 17 | ||||
-rw-r--r-- | Lib/test/output/test_profile | 12 | ||||
-rw-r--r-- | Lib/test/test_profile.py | 14 | ||||
-rw-r--r-- | 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 <string>: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() @@ -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. |