annotate Lib/profile.py @ 80661:94de77bd0b4b 2.7

Issue #16194: document imp.load_dynamic problems when read several extension modules from the same binary object file.
author Andrew Svetlov <andrew.svetlov@gmail.com>
date Thu, 29 Nov 2012 19:51:28 +0200
parents e1cf94dd4045
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4573
73758db2f464 /usr/local/bin/python -> /usr/bin/env python
Guido van Rossum <guido@python.org>
parents: 4347
diff changeset
1 #! /usr/bin/env python
839
1780eb8fde2b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 #
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
3 # Class for profiling python code. rev 1.0 6/2/94
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
4 #
71039
02150e60636b update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 55940
diff changeset
5 # Written by James Roskind
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
6 # Based on prior profile module by Sjoerd Mullender...
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
7 # which was hacked somewhat by: Guido van Rossum
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
8
11706
b6f52c1ef6da More trivial comment -> docstring transformations by Ka-Ping Yee,
Guido van Rossum <guido@python.org>
parents: 10827
diff changeset
9 """Class for profiling Python code."""
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
10
71039
02150e60636b update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 55940
diff changeset
11 # Copyright Disney Enterprises, Inc. All Rights Reserved.
02150e60636b update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 55940
diff changeset
12 # Licensed to PSF under a Contributor Agreement
71043
Benjamin Peterson <benjamin@python.org>
parents: 71039
diff changeset
13 #
71039
02150e60636b update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 55940
diff changeset
14 # Licensed under the Apache License, Version 2.0 (the "License");
02150e60636b update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 55940
diff changeset
15 # you may not use this file except in compliance with the License.
02150e60636b update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 55940
diff changeset
16 # You may obtain a copy of the License at
71043
Benjamin Peterson <benjamin@python.org>
parents: 71039
diff changeset
17 #
71039
02150e60636b update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 55940
diff changeset
18 # http://www.apache.org/licenses/LICENSE-2.0
71043
Benjamin Peterson <benjamin@python.org>
parents: 71039
diff changeset
19 #
71039
02150e60636b update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 55940
diff changeset
20 # Unless required by applicable law or agreed to in writing, software
02150e60636b update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 55940
diff changeset
21 # distributed under the License is distributed on an "AS IS" BASIS,
02150e60636b update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 55940
diff changeset
22 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
02150e60636b update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 55940
diff changeset
23 # either express or implied. See the License for the specific language
02150e60636b update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 55940
diff changeset
24 # governing permissions and limitations under the License.
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
25
839
1780eb8fde2b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26
1780eb8fde2b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 import sys
1006
903071377d29 Added a _v21 def to FL.py and added two new input field types
Guido van Rossum <guido@python.org>
parents: 839
diff changeset
28 import os
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
29 import time
1006
903071377d29 Added a _v21 def to FL.py and added two new input field types
Guido van Rossum <guido@python.org>
parents: 839
diff changeset
30 import marshal
31782
6a1505613358 Added command line options for profile.py - one for stats output file
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31770
diff changeset
31 from optparse import OptionParser
839
1780eb8fde2b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32
31785
dc5bd8422d52 Add runctx to __all__.
Guido van Rossum <guido@python.org>
parents: 31782
diff changeset
33 __all__ = ["run", "runctx", "help", "Profile"]
839
1780eb8fde2b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
35 # Sample timer for use with
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
36 #i_count = 0
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
37 #def integer_timer():
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
38 # global i_count
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
39 # i_count = i_count + 1
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
40 # return i_count
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
41 #itimes = integer_timer # replace with C coded timer returning integers
839
1780eb8fde2b Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
43 #**************************************************************************
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
44 # The following are the static member functions for the profiler class
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
45 # Note that an instance of Profile() is *not* needed to call them.
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
46 #**************************************************************************
1006
903071377d29 Added a _v21 def to FL.py and added two new input field types
Guido van Rossum <guido@python.org>
parents: 839
diff changeset
47
31782
6a1505613358 Added command line options for profile.py - one for stats output file
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31770
diff changeset
48 def run(statement, filename=None, sort=-1):
17042
3375a2a98e56 Add doc string for run from profile.doc. (pydoc motivates me to write
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16562
diff changeset
49 """Run statement under profiler optionally saving results in filename
1006
903071377d29 Added a _v21 def to FL.py and added two new input field types
Guido van Rossum <guido@python.org>
parents: 839
diff changeset
50
17042
3375a2a98e56 Add doc string for run from profile.doc. (pydoc motivates me to write
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16562
diff changeset
51 This function takes a single argument that can be passed to the
3375a2a98e56 Add doc string for run from profile.doc. (pydoc motivates me to write
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16562
diff changeset
52 "exec" statement, and an optional file name. In all cases this
3375a2a98e56 Add doc string for run from profile.doc. (pydoc motivates me to write
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16562
diff changeset
53 routine attempts to "exec" its first argument and gather profiling
3375a2a98e56 Add doc string for run from profile.doc. (pydoc motivates me to write
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16562
diff changeset
54 statistics from the execution. If no file name is present, then this
3375a2a98e56 Add doc string for run from profile.doc. (pydoc motivates me to write
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16562
diff changeset
55 function automatically prints a simple profiling report, sorted by the
3375a2a98e56 Add doc string for run from profile.doc. (pydoc motivates me to write
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16562
diff changeset
56 standard name string (file/line/function-name) that is presented in
3375a2a98e56 Add doc string for run from profile.doc. (pydoc motivates me to write
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16562
diff changeset
57 each line.
3375a2a98e56 Add doc string for run from profile.doc. (pydoc motivates me to write
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16562
diff changeset
58 """
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
59 prof = Profile()
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
60 try:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
61 prof = prof.run(statement)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
62 except SystemExit:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
63 pass
17042
3375a2a98e56 Add doc string for run from profile.doc. (pydoc motivates me to write
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16562
diff changeset
64 if filename is not None:
3375a2a98e56 Add doc string for run from profile.doc. (pydoc motivates me to write
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16562
diff changeset
65 prof.dump_stats(filename)
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
66 else:
31782
6a1505613358 Added command line options for profile.py - one for stats output file
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31770
diff changeset
67 return prof.print_stats(sort)
1357
2fac209e1c3f * profile.py, pdb.py: added help() function
Guido van Rossum <guido@python.org>
parents: 1335
diff changeset
68
64713
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
69 def runctx(statement, globals, locals, filename=None, sort=-1):
31770
ef591e7c34fd Added global runctx function to profile to fix SF Bug #716587
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31515
diff changeset
70 """Run statement under profiler, supplying your own globals and locals,
ef591e7c34fd Added global runctx function to profile to fix SF Bug #716587
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31515
diff changeset
71 optionally saving results in filename.
ef591e7c34fd Added global runctx function to profile to fix SF Bug #716587
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31515
diff changeset
72
ef591e7c34fd Added global runctx function to profile to fix SF Bug #716587
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31515
diff changeset
73 statement and filename have the same semantics as profile.run
ef591e7c34fd Added global runctx function to profile to fix SF Bug #716587
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31515
diff changeset
74 """
ef591e7c34fd Added global runctx function to profile to fix SF Bug #716587
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31515
diff changeset
75 prof = Profile()
ef591e7c34fd Added global runctx function to profile to fix SF Bug #716587
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31515
diff changeset
76 try:
ef591e7c34fd Added global runctx function to profile to fix SF Bug #716587
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31515
diff changeset
77 prof = prof.runctx(statement, globals, locals)
ef591e7c34fd Added global runctx function to profile to fix SF Bug #716587
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31515
diff changeset
78 except SystemExit:
ef591e7c34fd Added global runctx function to profile to fix SF Bug #716587
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31515
diff changeset
79 pass
ef591e7c34fd Added global runctx function to profile to fix SF Bug #716587
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31515
diff changeset
80
ef591e7c34fd Added global runctx function to profile to fix SF Bug #716587
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31515
diff changeset
81 if filename is not None:
ef591e7c34fd Added global runctx function to profile to fix SF Bug #716587
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31515
diff changeset
82 prof.dump_stats(filename)
ef591e7c34fd Added global runctx function to profile to fix SF Bug #716587
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31515
diff changeset
83 else:
64713
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
84 return prof.print_stats(sort)
31770
ef591e7c34fd Added global runctx function to profile to fix SF Bug #716587
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31515
diff changeset
85
34382
a31681a6cf88 Bug #489256: remove out of date and out of place profile.doc, and let
Johannes Gijsbers <jlg@dds.nl>
parents: 34375
diff changeset
86 # Backwards compatibility.
1357
2fac209e1c3f * profile.py, pdb.py: added help() function
Guido van Rossum <guido@python.org>
parents: 1335
diff changeset
87 def help():
34382
a31681a6cf88 Bug #489256: remove out of date and out of place profile.doc, and let
Johannes Gijsbers <jlg@dds.nl>
parents: 34375
diff changeset
88 print "Documentation for the profile module can be found "
a31681a6cf88 Bug #489256: remove out of date and out of place profile.doc, and let
Johannes Gijsbers <jlg@dds.nl>
parents: 34375
diff changeset
89 print "in the Python Library Reference, section 'The Python Profiler'."
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
90
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
91 if hasattr(os, "times"):
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
92 def _get_time_times(timer=os.times):
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
93 t = timer()
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
94 return t[0] + t[1]
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
95
34663
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
96 # Using getrusage(3) is better than clock(3) if available:
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
97 # on some systems (e.g. FreeBSD), getrusage has a higher resolution
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
98 # Furthermore, on a POSIX system, returns microseconds, which
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
99 # wrap around after 36min.
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
100 _has_res = 0
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
101 try:
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
102 import resource
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
103 resgetrusage = lambda: resource.getrusage(resource.RUSAGE_SELF)
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
104 def _get_time_resource(timer=resgetrusage):
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
105 t = timer()
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
106 return t[0] + t[1]
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
107 _has_res = 1
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
108 except ImportError:
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
109 pass
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
110
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
111 class Profile:
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
112 """Profiler class.
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
113
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
114 self.cur is always a tuple. Each such tuple corresponds to a stack
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
115 frame that is currently active (self.cur[-2]). The following are the
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
116 definitions of its members. We use this external "parallel stack" to
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
117 avoid contaminating the program that we are profiling. (old profiler
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
118 used to write into the frames local dictionary!!) Derived classes
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
119 can change the definition of some entries, as long as they leave
20289
6e7d5ae2800f The fix to profile semantics broke the miserable but advertised way to
Tim Peters <tim.peters@gmail.com>
parents: 20238
diff changeset
120 [-2:] intact (frame and previous tuple). In case an internal error is
6e7d5ae2800f The fix to profile semantics broke the miserable but advertised way to
Tim Peters <tim.peters@gmail.com>
parents: 20238
diff changeset
121 detected, the -3 element is used as the function name.
11706
b6f52c1ef6da More trivial comment -> docstring transformations by Ka-Ping Yee,
Guido van Rossum <guido@python.org>
parents: 10827
diff changeset
122
20289
6e7d5ae2800f The fix to profile semantics broke the miserable but advertised way to
Tim Peters <tim.peters@gmail.com>
parents: 20238
diff changeset
123 [ 0] = Time that needs to be charged to the parent frame's function.
6e7d5ae2800f The fix to profile semantics broke the miserable but advertised way to
Tim Peters <tim.peters@gmail.com>
parents: 20238
diff changeset
124 It is used so that a function call will not have to access the
6e7d5ae2800f The fix to profile semantics broke the miserable but advertised way to
Tim Peters <tim.peters@gmail.com>
parents: 20238
diff changeset
125 timing data for the parent frame.
6e7d5ae2800f The fix to profile semantics broke the miserable but advertised way to
Tim Peters <tim.peters@gmail.com>
parents: 20238
diff changeset
126 [ 1] = Total time spent in this frame's function, excluding time in
20300
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
127 subfunctions (this latter is tallied in cur[2]).
20302
c5345c0abd70 Typo repair in comment.
Tim Peters <tim.peters@gmail.com>
parents: 20300
diff changeset
128 [ 2] = Total time spent in subfunctions, excluding time executing the
20300
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
129 frame's function (this latter is tallied in cur[1]).
20289
6e7d5ae2800f The fix to profile semantics broke the miserable but advertised way to
Tim Peters <tim.peters@gmail.com>
parents: 20238
diff changeset
130 [-3] = Name of the function that corresponds to this frame.
20300
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
131 [-2] = Actual frame that we correspond to (used to sync exception handling).
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
132 [-1] = Our parent 6-tuple (corresponds to frame.f_back).
11706
b6f52c1ef6da More trivial comment -> docstring transformations by Ka-Ping Yee,
Guido van Rossum <guido@python.org>
parents: 10827
diff changeset
133
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
134 Timing data for each function is stored as a 5-tuple in the dictionary
20289
6e7d5ae2800f The fix to profile semantics broke the miserable but advertised way to
Tim Peters <tim.peters@gmail.com>
parents: 20238
diff changeset
135 self.timings[]. The index is always the name stored in self.cur[-3].
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
136 The following are the definitions of the members:
11706
b6f52c1ef6da More trivial comment -> docstring transformations by Ka-Ping Yee,
Guido van Rossum <guido@python.org>
parents: 10827
diff changeset
137
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
138 [0] = The number of times this function was called, not counting direct
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
139 or indirect recursion,
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
140 [1] = Number of times this function appears on the stack, minus one
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
141 [2] = Total time spent internal to this function
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
142 [3] = Cumulative time that this function was present on the stack. In
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
143 non-recursive functions, this is the total execution time from start
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
144 to finish of each invocation of a function, including time spent in
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
145 all subfunctions.
20297
79392ab2c02a Repair some longstanding comment errors:
Tim Peters <tim.peters@gmail.com>
parents: 20295
diff changeset
146 [4] = A dictionary indicating for each function name, the number of times
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
147 it was called by us.
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
148 """
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
149
20347
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
150 bias = 0 # calibration constant
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
151
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
152 def __init__(self, timer=None, bias=None):
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
153 self.timings = {}
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
154 self.cur = None
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
155 self.cmd = ""
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
156 self.c_func_name = ""
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
157
20347
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
158 if bias is None:
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
159 bias = self.bias
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
160 self.bias = bias # Materialize in local dict for lookup speed.
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
161
34663
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
162 if not timer:
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
163 if _has_res:
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
164 self.timer = resgetrusage
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
165 self.dispatcher = self.trace_dispatch
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
166 self.get_time = _get_time_resource
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
167 elif hasattr(time, 'clock'):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
168 self.timer = self.get_time = time.clock
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
169 self.dispatcher = self.trace_dispatch_i
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
170 elif hasattr(os, 'times'):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
171 self.timer = os.times
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
172 self.dispatcher = self.trace_dispatch
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
173 self.get_time = _get_time_times
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
174 else:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
175 self.timer = self.get_time = time.time
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
176 self.dispatcher = self.trace_dispatch_i
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
177 else:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
178 self.timer = timer
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
179 t = self.timer() # test out timer function
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
180 try:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
181 length = len(t)
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
182 except TypeError:
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
183 self.get_time = timer
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
184 self.dispatcher = self.trace_dispatch_i
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
185 else:
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
186 if length == 2:
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
187 self.dispatcher = self.trace_dispatch
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
188 else:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
189 self.dispatcher = self.trace_dispatch_l
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
190 # This get_time() implementation needs to be defined
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
191 # here to capture the passed-in timer in the parameter
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
192 # list (for performance). Note that we can't assume
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
193 # the timer() result contains two values in all
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
194 # cases.
30756
b6902c0a7578 Replace a reduce() with sum().
Raymond Hettinger <python@rcn.com>
parents: 28089
diff changeset
195 def get_time_timer(timer=timer, sum=sum):
b6902c0a7578 Replace a reduce() with sum().
Raymond Hettinger <python@rcn.com>
parents: 28089
diff changeset
196 return sum(timer())
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
197 self.get_time = get_time_timer
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
198 self.t = self.get_time()
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
199 self.simulate_call('profiler')
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
200
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
201 # Heavily optimized dispatch routine for os.times() timer
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
202
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
203 def trace_dispatch(self, frame, event, arg):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
204 timer = self.timer
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
205 t = timer()
20347
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
206 t = t[0] + t[1] - self.t - self.bias
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
207
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
208 if event == "c_call":
32642
db994849cdf3 Using repr() generates entries that the current stats package can't
Nicholas Bastin <nick.bastin@gmail.com>
parents: 32637
diff changeset
209 self.c_func_name = arg.__name__
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
210
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
211 if self.dispatch[event](self, frame,t):
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
212 t = timer()
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
213 self.t = t[0] + t[1]
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
214 else:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
215 r = timer()
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
216 self.t = r[0] + r[1] - t # put back unrecorded delta
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
217
20297
79392ab2c02a Repair some longstanding comment errors:
Tim Peters <tim.peters@gmail.com>
parents: 20295
diff changeset
218 # Dispatch routine for best timer program (return = scalar, fastest if
79392ab2c02a Repair some longstanding comment errors:
Tim Peters <tim.peters@gmail.com>
parents: 20295
diff changeset
219 # an integer but float works too -- and time.clock() relies on that).
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
220
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
221 def trace_dispatch_i(self, frame, event, arg):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
222 timer = self.timer
20347
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
223 t = timer() - self.t - self.bias
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
224
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
225 if event == "c_call":
32642
db994849cdf3 Using repr() generates entries that the current stats package can't
Nicholas Bastin <nick.bastin@gmail.com>
parents: 32637
diff changeset
226 self.c_func_name = arg.__name__
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
227
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
228 if self.dispatch[event](self, frame, t):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
229 self.t = timer()
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
230 else:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
231 self.t = timer() - t # put back unrecorded delta
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
232
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
233 # Dispatch routine for macintosh (timer returns time in ticks of
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
234 # 1/60th second)
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
235
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
236 def trace_dispatch_mac(self, frame, event, arg):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
237 timer = self.timer
20347
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
238 t = timer()/60.0 - self.t - self.bias
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
239
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
240 if event == "c_call":
32642
db994849cdf3 Using repr() generates entries that the current stats package can't
Nicholas Bastin <nick.bastin@gmail.com>
parents: 32637
diff changeset
241 self.c_func_name = arg.__name__
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
242
20347
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
243 if self.dispatch[event](self, frame, t):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
244 self.t = timer()/60.0
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
245 else:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
246 self.t = timer()/60.0 - t # put back unrecorded delta
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
247
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
248 # SLOW generic dispatch routine for timer returning lists of numbers
6451
10413179a72a Use better timer on the mac
Guido van Rossum <guido@python.org>
parents: 4573
diff changeset
249
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
250 def trace_dispatch_l(self, frame, event, arg):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
251 get_time = self.get_time
20347
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
252 t = get_time() - self.t - self.bias
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
253
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
254 if event == "c_call":
32642
db994849cdf3 Using repr() generates entries that the current stats package can't
Nicholas Bastin <nick.bastin@gmail.com>
parents: 32637
diff changeset
255 self.c_func_name = arg.__name__
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
256
20347
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
257 if self.dispatch[event](self, frame, t):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
258 self.t = get_time()
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
259 else:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
260 self.t = get_time() - t # put back unrecorded delta
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
261
20300
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
262 # In the event handlers, the first 3 elements of self.cur are unpacked
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
263 # into vrbls w/ 3-letter names. The last two characters are meant to be
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
264 # mnemonic:
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
265 # _pt self.cur[0] "parent time" time to be charged to parent frame
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
266 # _it self.cur[1] "internal time" time spent directly in the function
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
267 # _et self.cur[2] "external time" time spent in subfunctions
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
268
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
269 def trace_dispatch_exception(self, frame, t):
20300
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
270 rpt, rit, ret, rfn, rframe, rcur = self.cur
20235
acfb278662c6 Undo previous patch; it did not quite work out.
Fred Drake <fdrake@acm.org>
parents: 20133
diff changeset
271 if (rframe is not frame) and rcur:
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
272 return self.trace_dispatch_return(rframe, t)
20300
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
273 self.cur = rpt, rit+t, ret, rfn, rframe, rcur
20238
e7aca2a302cd Hopefully fix the profiler right. Add a test suite that checks that
Guido van Rossum <guido@python.org>
parents: 20235
diff changeset
274 return 1
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
275
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
276
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
277 def trace_dispatch_call(self, frame, t):
20289
6e7d5ae2800f The fix to profile semantics broke the miserable but advertised way to
Tim Peters <tim.peters@gmail.com>
parents: 20238
diff changeset
278 if self.cur and frame.f_back is not self.cur[-2]:
20300
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
279 rpt, rit, ret, rfn, rframe, rcur = self.cur
20238
e7aca2a302cd Hopefully fix the profiler right. Add a test suite that checks that
Guido van Rossum <guido@python.org>
parents: 20235
diff changeset
280 if not isinstance(rframe, Profile.fake_frame):
20298
6211684ed9dd At Guido's request, changed the code that's conceptually asserting stuff
Tim Peters <tim.peters@gmail.com>
parents: 20297
diff changeset
281 assert rframe.f_back is frame.f_back, ("Bad call", rfn,
6211684ed9dd At Guido's request, changed the code that's conceptually asserting stuff
Tim Peters <tim.peters@gmail.com>
parents: 20297
diff changeset
282 rframe, rframe.f_back,
6211684ed9dd At Guido's request, changed the code that's conceptually asserting stuff
Tim Peters <tim.peters@gmail.com>
parents: 20297
diff changeset
283 frame, frame.f_back)
20238
e7aca2a302cd Hopefully fix the profiler right. Add a test suite that checks that
Guido van Rossum <guido@python.org>
parents: 20235
diff changeset
284 self.trace_dispatch_return(rframe, 0)
20298
6211684ed9dd At Guido's request, changed the code that's conceptually asserting stuff
Tim Peters <tim.peters@gmail.com>
parents: 20297
diff changeset
285 assert (self.cur is None or \
6211684ed9dd At Guido's request, changed the code that's conceptually asserting stuff
Tim Peters <tim.peters@gmail.com>
parents: 20297
diff changeset
286 frame.f_back is self.cur[-2]), ("Bad call",
6211684ed9dd At Guido's request, changed the code that's conceptually asserting stuff
Tim Peters <tim.peters@gmail.com>
parents: 20297
diff changeset
287 self.cur[-3])
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
288 fcode = frame.f_code
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
289 fn = (fcode.co_filename, fcode.co_firstlineno, fcode.co_name)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
290 self.cur = (t, 0, 0, fn, frame, self.cur)
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
291 timings = self.timings
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 21238
diff changeset
292 if fn in timings:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
293 cc, ns, tt, ct, callers = timings[fn]
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
294 timings[fn] = cc, ns + 1, tt, ct, callers
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
295 else:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
296 timings[fn] = 0, 0, 0, 0, {}
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
297 return 1
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
298
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
299 def trace_dispatch_c_call (self, frame, t):
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
300 fn = ("", 0, self.c_func_name)
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
301 self.cur = (t, 0, 0, fn, frame, self.cur)
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
302 timings = self.timings
48145
4e45d0cfaf71 Remove a dict.has_key() usage in profile to silence a -3 DeprecationWarning.
Brett Cannon <bcannon@gmail.com>
parents: 35611
diff changeset
303 if fn in timings:
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
304 cc, ns, tt, ct, callers = timings[fn]
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
305 timings[fn] = cc, ns+1, tt, ct, callers
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
306 else:
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
307 timings[fn] = 0, 0, 0, 0, {}
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
308 return 1
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
309
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
310 def trace_dispatch_return(self, frame, t):
20289
6e7d5ae2800f The fix to profile semantics broke the miserable but advertised way to
Tim Peters <tim.peters@gmail.com>
parents: 20238
diff changeset
311 if frame is not self.cur[-2]:
20298
6211684ed9dd At Guido's request, changed the code that's conceptually asserting stuff
Tim Peters <tim.peters@gmail.com>
parents: 20297
diff changeset
312 assert frame is self.cur[-2].f_back, ("Bad return", self.cur[-3])
6211684ed9dd At Guido's request, changed the code that's conceptually asserting stuff
Tim Peters <tim.peters@gmail.com>
parents: 20297
diff changeset
313 self.trace_dispatch_return(self.cur[-2], 0)
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
314
20300
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
315 # Prefix "r" means part of the Returning or exiting frame.
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
316 # Prefix "p" means part of the Previous or Parent or older frame.
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
317
20300
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
318 rpt, rit, ret, rfn, frame, rcur = self.cur
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
319 rit = rit + t
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
320 frame_total = rit + ret
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
321
20300
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
322 ppt, pit, pet, pfn, pframe, pcur = rcur
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
323 self.cur = ppt, pit + rpt, pet + frame_total, pfn, pframe, pcur
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
324
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
325 timings = self.timings
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
326 cc, ns, tt, ct, callers = timings[rfn]
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
327 if not ns:
20300
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
328 # This is the only occurrence of the function on the stack.
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
329 # Else this is a (directly or indirectly) recursive call, and
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
330 # its cumulative time will get updated when the topmost call to
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
331 # it returns.
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
332 ct = ct + frame_total
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
333 cc = cc + 1
20300
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
334
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 21238
diff changeset
335 if pfn in callers:
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
336 callers[pfn] = callers[pfn] + 1 # hack: gather more
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
337 # stats such as the amount of time added to ct courtesy
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
338 # of this specific call, and the contribution to cc
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
339 # courtesy of this call.
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
340 else:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
341 callers[pfn] = 1
20300
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
342
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
343 timings[rfn] = cc, ns - 1, tt + rit, ct, callers
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
344
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
345 return 1
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
346
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
347
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
348 dispatch = {
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
349 "call": trace_dispatch_call,
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
350 "exception": trace_dispatch_exception,
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
351 "return": trace_dispatch_return,
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
352 "c_call": trace_dispatch_c_call,
35611
af3a06625a6e test and fix for buggy handling of exceptions raised by C functions,
Armin Rigo <arigo@tunes.org>
parents: 34663
diff changeset
353 "c_exception": trace_dispatch_return, # the C function returned
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
354 "c_return": trace_dispatch_return,
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
355 }
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
356
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
357
20298
6211684ed9dd At Guido's request, changed the code that's conceptually asserting stuff
Tim Peters <tim.peters@gmail.com>
parents: 20297
diff changeset
358 # The next few functions play with self.cmd. By carefully preloading
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
359 # our parallel stack, we can force the profiled result to include
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
360 # an arbitrary string as the name of the calling function.
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
361 # We use self.cmd as that string, and the resulting stats look
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
362 # very nice :-).
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
363
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
364 def set_cmd(self, cmd):
20289
6e7d5ae2800f The fix to profile semantics broke the miserable but advertised way to
Tim Peters <tim.peters@gmail.com>
parents: 20238
diff changeset
365 if self.cur[-1]: return # already set
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
366 self.cmd = cmd
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
367 self.simulate_call(cmd)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
368
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
369 class fake_code:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
370 def __init__(self, filename, line, name):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
371 self.co_filename = filename
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
372 self.co_line = line
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
373 self.co_name = name
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
374 self.co_firstlineno = 0
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
375
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
376 def __repr__(self):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
377 return repr((self.co_filename, self.co_line, self.co_name))
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
378
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
379 class fake_frame:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
380 def __init__(self, code, prior):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
381 self.f_code = code
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
382 self.f_back = prior
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
383
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
384 def simulate_call(self, name):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
385 code = self.fake_code('profile', 0, name)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
386 if self.cur:
20289
6e7d5ae2800f The fix to profile semantics broke the miserable but advertised way to
Tim Peters <tim.peters@gmail.com>
parents: 20238
diff changeset
387 pframe = self.cur[-2]
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
388 else:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
389 pframe = None
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
390 frame = self.fake_frame(code, pframe)
20480
dd0cdd3defd8 Minor code cleanups based on comments from Neal Norwitz.
Fred Drake <fdrake@acm.org>
parents: 20350
diff changeset
391 self.dispatch['call'](self, frame, 0)
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
392
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
393 # collect stats from pending stack, including getting final
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
394 # timings for self.cmd frame.
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
395
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
396 def simulate_cmd_complete(self):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
397 get_time = self.get_time
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
398 t = get_time() - self.t
20289
6e7d5ae2800f The fix to profile semantics broke the miserable but advertised way to
Tim Peters <tim.peters@gmail.com>
parents: 20238
diff changeset
399 while self.cur[-1]:
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
400 # We *can* cause assertion errors here if
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
401 # dispatch_trace_return checks for a frame match!
20480
dd0cdd3defd8 Minor code cleanups based on comments from Neal Norwitz.
Fred Drake <fdrake@acm.org>
parents: 20350
diff changeset
402 self.dispatch['return'](self, self.cur[-2], t)
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
403 t = 0
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
404 self.t = get_time() - t
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
405
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
406
31782
6a1505613358 Added command line options for profile.py - one for stats output file
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31770
diff changeset
407 def print_stats(self, sort=-1):
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
408 import pstats
31782
6a1505613358 Added command line options for profile.py - one for stats output file
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31770
diff changeset
409 pstats.Stats(self).strip_dirs().sort_stats(sort). \
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
410 print_stats()
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
411
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
412 def dump_stats(self, file):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
413 f = open(file, 'wb')
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
414 self.create_stats()
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
415 marshal.dump(self.stats, f)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
416 f.close()
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
417
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
418 def create_stats(self):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
419 self.simulate_cmd_complete()
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
420 self.snapshot_stats()
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
421
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
422 def snapshot_stats(self):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
423 self.stats = {}
23634
dbee2f628a90 Replaced .keys() with dictionary iterators
Raymond Hettinger <python@rcn.com>
parents: 23622
diff changeset
424 for func, (cc, ns, tt, ct, callers) in self.timings.iteritems():
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
425 callers = callers.copy()
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
426 nc = 0
23634
dbee2f628a90 Replaced .keys() with dictionary iterators
Raymond Hettinger <python@rcn.com>
parents: 23622
diff changeset
427 for callcnt in callers.itervalues():
dbee2f628a90 Replaced .keys() with dictionary iterators
Raymond Hettinger <python@rcn.com>
parents: 23622
diff changeset
428 nc += callcnt
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
429 self.stats[func] = cc, nc, tt, ct, callers
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
430
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
431
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
432 # The following two methods can be called by clients to use
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
433 # a profiler to profile a statement, given as a string.
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
434
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
435 def run(self, cmd):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
436 import __main__
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
437 dict = __main__.__dict__
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
438 return self.runctx(cmd, dict, dict)
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
439
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
440 def runctx(self, cmd, globals, locals):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
441 self.set_cmd(cmd)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
442 sys.setprofile(self.dispatcher)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
443 try:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
444 exec cmd in globals, locals
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
445 finally:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
446 sys.setprofile(None)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
447 return self
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
448
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
449 # This method is more useful to profile a single function call.
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
450 def runcall(self, func, *args, **kw):
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30757
diff changeset
451 self.set_cmd(repr(func))
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
452 sys.setprofile(self.dispatcher)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
453 try:
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 23634
diff changeset
454 return func(*args, **kw)
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
455 finally:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
456 sys.setprofile(None)
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
457
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
458
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
459 #******************************************************************
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
460 # The following calculates the overhead for using a profiler. The
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
461 # problem is that it takes a fair amount of time for the profiler
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
462 # to stop the stopwatch (from the time it receives an event).
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
463 # Similarly, there is a delay from the time that the profiler
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
464 # re-starts the stopwatch before the user's code really gets to
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
465 # continue. The following code tries to measure the difference on
20347
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
466 # a per-event basis.
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
467 #
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
468 # Note that this difference is only significant if there are a lot of
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
469 # events, and relatively little user code per event. For example,
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
470 # code with small functions will typically benefit from having the
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
471 # profiler calibrated for the current platform. This *could* be
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
472 # done on the fly during init() time, but it is not worth the
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
473 # effort. Also note that if too large a value specified, then
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
474 # execution time on some functions will actually appear as a
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
475 # negative number. It is *normal* for some functions (with very
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
476 # low call counts) to have such negative stats, even if the
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
477 # calibration figure is "correct."
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
478 #
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
479 # One alternative to profile-time calibration adjustments (i.e.,
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
480 # adding in the magic little delta during each event) is to track
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
481 # more carefully the number of events (and cumulatively, the number
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
482 # of events during sub functions) that are seen. If this were
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
483 # done, then the arithmetic could be done after the fact (i.e., at
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
484 # display time). Currently, we track only call/return events.
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
485 # These values can be deduced by examining the callees and callers
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
486 # vectors for each functions. Hence we *can* almost correct the
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
487 # internal time figure at print time (note that we currently don't
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
488 # track exception event processing counts). Unfortunately, there
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
489 # is currently no similar information for cumulative sub-function
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
490 # time. It would not be hard to "get all this info" at profiler
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
491 # time. Specifically, we would have to extend the tuples to keep
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
492 # counts of this in each frame, and then extend the defs of timing
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
493 # tuples to include the significant two figures. I'm a bit fearful
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
494 # that this additional feature will slow the heavily optimized
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
495 # event/time ratio (i.e., the profiler would run slower, fur a very
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
496 # low "value added" feature.)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
497 #**************************************************************
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
498
20324
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
499 def calibrate(self, m, verbose=0):
20347
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
500 if self.__class__ is not Profile:
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
501 raise TypeError("Subclasses must override .calibrate().")
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
502
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
503 saved_bias = self.bias
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
504 self.bias = 0
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
505 try:
20350
0a915b22e006 Repair key stutter + auto-complete ugliness.
Tim Peters <tim.peters@gmail.com>
parents: 20347
diff changeset
506 return self._calibrate_inner(m, verbose)
20347
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
507 finally:
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
508 self.bias = saved_bias
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
509
20350
0a915b22e006 Repair key stutter + auto-complete ugliness.
Tim Peters <tim.peters@gmail.com>
parents: 20347
diff changeset
510 def _calibrate_inner(self, m, verbose):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
511 get_time = self.get_time
20324
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
512
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
513 # Set up a test case to be run with and without profiling. Include
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
514 # lots of calls, because we're trying to quantify stopwatch overhead.
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
515 # Do not raise any exceptions, though, because we want to know
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
516 # exactly how many profile events are generated (one call event, +
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
517 # one return event, per Python-level call).
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
518
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
519 def f1(n):
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
520 for i in range(n):
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
521 x = 1
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
522
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
523 def f(m, f1=f1):
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
524 for i in range(m):
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
525 f1(100)
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
526
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
527 f(m) # warm up the cache
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
528
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
529 # elapsed_noprofile <- time f(m) takes without profiling.
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
530 t0 = get_time()
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
531 f(m)
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
532 t1 = get_time()
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
533 elapsed_noprofile = t1 - t0
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
534 if verbose:
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
535 print "elapsed time without profiling =", elapsed_noprofile
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
536
20324
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
537 # elapsed_profile <- time f(m) takes with profiling. The difference
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
538 # is profiling overhead, only some of which the profiler subtracts
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
539 # out on its own.
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
540 p = Profile()
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
541 t0 = get_time()
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
542 p.runctx('f(m)', globals(), locals())
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
543 t1 = get_time()
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
544 elapsed_profile = t1 - t0
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
545 if verbose:
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
546 print "elapsed time with profiling =", elapsed_profile
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
547
20324
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
548 # reported_time <- "CPU seconds" the profiler charged to f and f1.
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
549 total_calls = 0.0
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
550 reported_time = 0.0
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
551 for (filename, line, funcname), (cc, ns, tt, ct, callers) in \
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
552 p.timings.items():
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
553 if funcname in ("f", "f1"):
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
554 total_calls += cc
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
555 reported_time += tt
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
556
20324
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
557 if verbose:
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
558 print "'CPU seconds' profiler reported =", reported_time
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
559 print "total # calls =", total_calls
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
560 if total_calls != m + 1:
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
561 raise ValueError("internal error: total calls = %d" % total_calls)
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
562
20324
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
563 # reported_time - elapsed_noprofile = overhead the profiler wasn't
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
564 # able to measure. Divide by twice the number of calls (since there
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
565 # are two profiler events per call in this test) to get the hidden
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
566 # overhead per event.
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
567 mean = (reported_time - elapsed_noprofile) / 2.0 / total_calls
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
568 if verbose:
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
569 print "mean stopwatch overhead per profile event =", mean
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
570 return mean
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
571
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
572 #****************************************************************************
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
573 def Stats(*args):
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
574 print 'Report generating functions are in the "pstats" module\a'
4347
a5c29accc438 Add main program similar to pdb.
Guido van Rossum <guido@python.org>
parents: 3634
diff changeset
575
34375
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
576 def main():
31782
6a1505613358 Added command line options for profile.py - one for stats output file
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31770
diff changeset
577 usage = "profile.py [-o output_file_path] [-s sort] scriptfile [arg] ..."
34375
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
578 parser = OptionParser(usage=usage)
31782
6a1505613358 Added command line options for profile.py - one for stats output file
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31770
diff changeset
579 parser.allow_interspersed_args = False
32528
67539cfcf09f Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 31796
diff changeset
580 parser.add_option('-o', '--outfile', dest="outfile",
31782
6a1505613358 Added command line options for profile.py - one for stats output file
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31770
diff changeset
581 help="Save stats to <outfile>", default=None)
6a1505613358 Added command line options for profile.py - one for stats output file
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31770
diff changeset
582 parser.add_option('-s', '--sort', dest="sort",
64713
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
583 help="Sort order when printing to stdout, based on pstats.Stats class",
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
584 default=-1)
34388
598d16fa02c1 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34382
diff changeset
585
34375
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
586 if not sys.argv[1:]:
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
587 parser.print_usage()
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
588 sys.exit(2)
34388
598d16fa02c1 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34382
diff changeset
589
31782
6a1505613358 Added command line options for profile.py - one for stats output file
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31770
diff changeset
590 (options, args) = parser.parse_args()
64713
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
591 sys.argv[:] = args
34388
598d16fa02c1 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34382
diff changeset
592
64713
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
593 if len(args) > 0:
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
594 progname = args[0]
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
595 sys.path.insert(0, os.path.dirname(progname))
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
596 with open(progname, 'rb') as fp:
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
597 code = compile(fp.read(), progname, 'exec')
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
598 globs = {
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
599 '__file__': progname,
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
600 '__name__': '__main__',
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
601 '__package__': None,
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
602 }
2ad8d7cbceab Merged revisions 83524,84776 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 61258
diff changeset
603 runctx(code, globs, None, options.outfile, options.sort)
31782
6a1505613358 Added command line options for profile.py - one for stats output file
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31770
diff changeset
604 else:
34375
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
605 parser.print_usage()
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
606 return parser
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
607
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
608 # When invoked as main program, invoke the profiler on a script
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
609 if __name__ == '__main__':
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
610 main()