]> granicus.if.org Git - python/commitdiff
Added global runctx function to profile to fix SF Bug #716587
authorNicholas Bastin <nick.bastin@gmail.com>
Mon, 22 Mar 2004 20:12:56 +0000 (20:12 +0000)
committerNicholas Bastin <nick.bastin@gmail.com>
Mon, 22 Mar 2004 20:12:56 +0000 (20:12 +0000)
Doc/lib/libprofile.tex
Lib/profile.py
Lib/test/output/test_profile
Lib/test/test_profile.py
Misc/NEWS

index 4d62094dadc4fc326b86b53059c8d8384c94a979..608e1cde4e8bdbb6cee6dbcdd74ffbe921237277 100644 (file)
@@ -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:
 
index 2dc6e8734c4ef4abbe37961daea4efcce0604083..1a4ff67370be3ed475b11c24258ecb540999d9cf 100755 (executable)
@@ -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:
index b36a016aef68831e4308d2b570c8e99edf50f6d2..917a18eb0935dff771c228af2a2d9ffcb075e2e1 100644 (file)
@@ -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__)
 
 
index 6ff5811817e11da42d5850072579132385dcf1b0..1b1f50bfe986f806bcfc81f8fa55169665c477df 100644 (file)
@@ -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()
index a1655e7b37bf505e7c9689808c41fc1796fe0557..50c5249bf5c9eadb270f70b1c9b922b59ec31571 100644 (file)
--- 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.