annotate Lib/profile.py @ 78069:a8aa77458e12 3.2

Add c_size_t and c_ssize_t to the ctypes summary table.
author Antoine Pitrou <solipsis@pitrou.net>
date Thu, 12 Jul 2012 20:31:50 +0200
parents ecf17d9b0212
children bd195749c0a2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
59522
fcfe324663a6 convert shebang lines: python -> python3
Benjamin Peterson <benjamin@python.org>
parents: 55941
diff changeset
1 #! /usr/bin/env python3
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 #
71040
633597815463 update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 65115
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
71040
633597815463 update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 65115
diff changeset
11 # Copyright Disney Enterprises, Inc. All Rights Reserved.
633597815463 update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 65115
diff changeset
12 # Licensed to PSF under a Contributor Agreement
71013
adc244036ef7 strip trailing ws
Benjamin Peterson <benjamin@python.org>
parents: 71006
diff changeset
13 #
71040
633597815463 update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 65115
diff changeset
14 # Licensed under the Apache License, Version 2.0 (the "License");
633597815463 update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 65115
diff changeset
15 # you may not use this file except in compliance with the License.
633597815463 update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 65115
diff changeset
16 # You may obtain a copy of the License at
71013
adc244036ef7 strip trailing ws
Benjamin Peterson <benjamin@python.org>
parents: 71006
diff changeset
17 #
71040
633597815463 update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 65115
diff changeset
18 # http://www.apache.org/licenses/LICENSE-2.0
71013
adc244036ef7 strip trailing ws
Benjamin Peterson <benjamin@python.org>
parents: 71006
diff changeset
19 #
71040
633597815463 update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 65115
diff changeset
20 # Unless required by applicable law or agreed to in writing, software
633597815463 update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 65115
diff changeset
21 # distributed under the License is distributed on an "AS IS" BASIS,
633597815463 update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 65115
diff changeset
22 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
633597815463 update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 65115
diff changeset
23 # either express or implied. See the License for the specific language
633597815463 update profile license (closes #12417)
Benjamin Peterson <benjamin@python.org>
parents: 65115
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
55833
4ddc0598df79 Remove the just-removed "help" from __all__.
Georg Brandl <georg@python.org>
parents: 55818
diff changeset
33 __all__ = ["run", "runctx", "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
65115
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
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:
65115
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
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
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
86 if hasattr(os, "times"):
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
87 def _get_time_times(timer=os.times):
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
88 t = timer()
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
89 return t[0] + t[1]
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
90
34663
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
91 # 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
92 # 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
93 # 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
94 # 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
95 _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
96 try:
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
97 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
98 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
99 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
100 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
101 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
102 _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
103 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
104 pass
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
105
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
106 class Profile:
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
107 """Profiler class.
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
108
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
109 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
110 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
111 definitions of its members. We use this external "parallel stack" to
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
112 avoid contaminating the program that we are profiling. (old profiler
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
113 used to write into the frames local dictionary!!) Derived classes
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
114 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
115 [-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
116 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
117
20289
6e7d5ae2800f The fix to profile semantics broke the miserable but advertised way to
Tim Peters <tim.peters@gmail.com>
parents: 20238
diff changeset
118 [ 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
119 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
120 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
121 [ 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
122 subfunctions (this latter is tallied in cur[2]).
20302
c5345c0abd70 Typo repair in comment.
Tim Peters <tim.peters@gmail.com>
parents: 20300
diff changeset
123 [ 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
124 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
125 [-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
126 [-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
127 [-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
128
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
129 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
130 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
131 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
132
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
133 [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
134 or indirect recursion,
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
135 [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
136 [2] = Total time spent internal to this function
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
137 [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
138 non-recursive functions, this is the total execution time from start
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
139 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
140 all subfunctions.
20297
79392ab2c02a Repair some longstanding comment errors:
Tim Peters <tim.peters@gmail.com>
parents: 20295
diff changeset
141 [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
142 it was called by us.
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
143 """
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
144
20347
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
145 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
146
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
147 def __init__(self, timer=None, bias=None):
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
148 self.timings = {}
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
149 self.cur = None
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
150 self.cmd = ""
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
151 self.c_func_name = ""
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
152
20347
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
153 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
154 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
155 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
156
34663
9d608419cdf8 Patch #645894: Use getrusage for computing the time consumption in
Martin v. Löwis <martin@v.loewis.de>
parents: 34388
diff changeset
157 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
158 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
159 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
160 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
161 self.get_time = _get_time_resource
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
162 elif hasattr(time, 'clock'):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
163 self.timer = self.get_time = time.clock
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
164 self.dispatcher = self.trace_dispatch_i
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
165 elif hasattr(os, 'times'):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
166 self.timer = os.times
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
167 self.dispatcher = self.trace_dispatch
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
168 self.get_time = _get_time_times
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
169 else:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
170 self.timer = self.get_time = time.time
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
171 self.dispatcher = self.trace_dispatch_i
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
172 else:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
173 self.timer = timer
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
174 t = self.timer() # test out timer function
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
175 try:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
176 length = len(t)
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
177 except TypeError:
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
178 self.get_time = timer
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
179 self.dispatcher = self.trace_dispatch_i
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
180 else:
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
181 if length == 2:
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
182 self.dispatcher = self.trace_dispatch
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
183 else:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
184 self.dispatcher = self.trace_dispatch_l
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
185 # This get_time() implementation needs to be defined
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
186 # 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
187 # list (for performance). Note that we can't assume
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
188 # the timer() result contains two values in all
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
189 # cases.
30756
b6902c0a7578 Replace a reduce() with sum().
Raymond Hettinger <python@rcn.com>
parents: 28089
diff changeset
190 def get_time_timer(timer=timer, sum=sum):
b6902c0a7578 Replace a reduce() with sum().
Raymond Hettinger <python@rcn.com>
parents: 28089
diff changeset
191 return sum(timer())
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
192 self.get_time = get_time_timer
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
193 self.t = self.get_time()
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
194 self.simulate_call('profiler')
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
195
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
196 # 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
197
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
198 def trace_dispatch(self, frame, event, arg):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
199 timer = self.timer
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
200 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
201 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
202
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
203 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
204 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
205
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
206 if self.dispatch[event](self, frame,t):
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
207 t = timer()
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
208 self.t = t[0] + t[1]
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
209 else:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
210 r = timer()
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
211 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
212
20297
79392ab2c02a Repair some longstanding comment errors:
Tim Peters <tim.peters@gmail.com>
parents: 20295
diff changeset
213 # 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
214 # 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
215
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
216 def trace_dispatch_i(self, frame, event, arg):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
217 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
218 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
219
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
220 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
221 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
222
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
223 if self.dispatch[event](self, frame, t):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
224 self.t = timer()
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
225 else:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
226 self.t = timer() - t # put back unrecorded delta
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
227
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
228 # 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
229 # 1/60th second)
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
230
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
231 def trace_dispatch_mac(self, frame, event, arg):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
232 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
233 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
234
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
235 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
236 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
237
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 if self.dispatch[event](self, frame, t):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
239 self.t = timer()/60.0
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
240 else:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
241 self.t = timer()/60.0 - t # put back unrecorded delta
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
242
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
243 # 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
244
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
245 def trace_dispatch_l(self, frame, event, arg):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
246 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
247 t = get_time() - self.t - self.bias
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
248
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
249 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
250 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
251
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 if self.dispatch[event](self, frame, t):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
253 self.t = get_time()
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
254 else:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
255 self.t = get_time() - t # put back unrecorded delta
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
256
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
257 # 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
258 # 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
259 # 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
260 # _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
261 # _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
262 # _et self.cur[2] "external time" time spent in subfunctions
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
263
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
264 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
265 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
266 if (rframe is not frame) and rcur:
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
267 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
268 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
269 return 1
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
270
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
271
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
272 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
273 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
274 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
275 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
276 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
277 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
278 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
279 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
280 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
281 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
282 self.cur[-3])
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
283 fcode = frame.f_code
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
284 fn = (fcode.co_filename, fcode.co_firstlineno, fcode.co_name)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
285 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
286 timings = self.timings
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 21238
diff changeset
287 if fn in timings:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
288 cc, ns, tt, ct, callers = timings[fn]
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
289 timings[fn] = cc, ns + 1, tt, ct, callers
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
290 else:
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
291 timings[fn] = 0, 0, 0, 0, {}
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
292 return 1
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
293
31796
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
294 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
295 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
296 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
297 timings = self.timings
39575
63237fcefd99 Get rid of dict.has_key(). Boy this has a lot of repercussions!
Guido van Rossum <guido@python.org>
parents: 35611
diff changeset
298 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
299 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
300 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
301 else:
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
302 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
303 return 1
1c117dbb2def Enable the profiling of C functions (builtins and extensions)
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31785
diff changeset
304
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
305 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
306 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
307 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
308 self.trace_dispatch_return(self.cur[-2], 0)
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
309
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
310 # 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
311 # 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
312
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
313 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
314 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
315 frame_total = rit + ret
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
316
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
317 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
318 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
319
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
320 timings = self.timings
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
321 cc, ns, tt, ct, callers = timings[rfn]
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
322 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
323 # 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
324 # 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
325 # 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
326 # 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
327 ct = ct + frame_total
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
328 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
329
23620
a1de0bab5475 SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents: 21238
diff changeset
330 if pfn in callers:
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
331 callers[pfn] = callers[pfn] + 1 # hack: gather more
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
332 # stats such as the amount of time added to ct courtesy
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
333 # of this specific call, and the contribution to cc
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
334 # courtesy of this call.
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
335 else:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
336 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
337
874bb17074b0 Guido points out that the comments for self.cur[2] were subtly but
Tim Peters <tim.peters@gmail.com>
parents: 20298
diff changeset
338 timings[rfn] = cc, ns - 1, tt + rit, ct, callers
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
339
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
340 return 1
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
341
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
342
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
343 dispatch = {
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
344 "call": trace_dispatch_call,
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
345 "exception": trace_dispatch_exception,
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
346 "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
347 "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
348 "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
349 "c_return": trace_dispatch_return,
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
350 }
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
351
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
352
20298
6211684ed9dd At Guido's request, changed the code that's conceptually asserting stuff
Tim Peters <tim.peters@gmail.com>
parents: 20297
diff changeset
353 # 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
354 # our parallel stack, we can force the profiled result to include
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
355 # an arbitrary string as the name of the calling function.
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
356 # 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
357 # very nice :-).
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
358
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
359 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
360 if self.cur[-1]: return # already set
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
361 self.cmd = cmd
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
362 self.simulate_call(cmd)
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 class fake_code:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
365 def __init__(self, filename, line, name):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
366 self.co_filename = filename
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
367 self.co_line = line
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
368 self.co_name = name
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
369 self.co_firstlineno = 0
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
370
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
371 def __repr__(self):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
372 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
373
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
374 class fake_frame:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
375 def __init__(self, code, prior):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
376 self.f_code = code
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
377 self.f_back = prior
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 def simulate_call(self, name):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
380 code = self.fake_code('profile', 0, name)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
381 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
382 pframe = self.cur[-2]
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
383 else:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
384 pframe = None
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
385 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
386 self.dispatch['call'](self, frame, 0)
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
387
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
388 # collect stats from pending stack, including getting final
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
389 # timings for self.cmd frame.
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
390
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
391 def simulate_cmd_complete(self):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
392 get_time = self.get_time
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
393 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
394 while self.cur[-1]:
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
395 # We *can* cause assertion errors here if
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
396 # 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
397 self.dispatch['return'](self, self.cur[-2], t)
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
398 t = 0
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
399 self.t = get_time() - t
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
400
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
401
31782
6a1505613358 Added command line options for profile.py - one for stats output file
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31770
diff changeset
402 def print_stats(self, sort=-1):
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
403 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
404 pstats.Stats(self).strip_dirs().sort_stats(sort). \
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
405 print_stats()
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
406
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
407 def dump_stats(self, file):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
408 f = open(file, 'wb')
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
409 self.create_stats()
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
410 marshal.dump(self.stats, f)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
411 f.close()
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
412
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
413 def create_stats(self):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
414 self.simulate_cmd_complete()
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
415 self.snapshot_stats()
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
416
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
417 def snapshot_stats(self):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
418 self.stats = {}
40809
f340cb045bf9 - PEP 3106: dict.iterkeys(), .iteritems(), .itervalues() are now gone;
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
419 for func, (cc, ns, tt, ct, callers) in self.timings.items():
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
420 callers = callers.copy()
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
421 nc = 0
40809
f340cb045bf9 - PEP 3106: dict.iterkeys(), .iteritems(), .itervalues() are now gone;
Guido van Rossum <guido@python.org>
parents: 40775
diff changeset
422 for callcnt in callers.values():
23634
dbee2f628a90 Replaced .keys() with dictionary iterators
Raymond Hettinger <python@rcn.com>
parents: 23622
diff changeset
423 nc += callcnt
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
424 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
425
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
426
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
427 # The following two methods can be called by clients to use
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
428 # 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
429
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
430 def run(self, cmd):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
431 import __main__
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
432 dict = __main__.__dict__
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
433 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
434
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
435 def runctx(self, cmd, globals, locals):
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
436 self.set_cmd(cmd)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
437 sys.setprofile(self.dispatcher)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
438 try:
39782
c94f37054f19 Patch #1550800: make exec a function.
Georg Brandl <georg@python.org>
parents: 39575
diff changeset
439 exec(cmd, globals, locals)
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
440 finally:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
441 sys.setprofile(None)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
442 return self
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
443
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
444 # 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
445 def runcall(self, func, *args, **kw):
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 30757
diff changeset
446 self.set_cmd(repr(func))
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
447 sys.setprofile(self.dispatcher)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
448 try:
28089
14f65d661084 Get rid of many apply() calls.
Guido van Rossum <guido@python.org>
parents: 23634
diff changeset
449 return func(*args, **kw)
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
450 finally:
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
451 sys.setprofile(None)
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
452
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
453
15870
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
454 #******************************************************************
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
455 # The following calculates the overhead for using a profiler. The
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
456 # 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
457 # to stop the stopwatch (from the time it receives an event).
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
458 # Similarly, there is a delay from the time that the profiler
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
459 # 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
460 # 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
461 # 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
462 #
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
463 # 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
464 # events, and relatively little user code per event. For example,
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
465 # code with small functions will typically benefit from having the
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
466 # profiler calibrated for the current platform. This *could* be
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
467 # 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
468 # effort. Also note that if too large a value specified, then
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
469 # execution time on some functions will actually appear as a
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
470 # negative number. It is *normal* for some functions (with very
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
471 # low call counts) to have such negative stats, even if the
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
472 # calibration figure is "correct."
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
473 #
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
474 # One alternative to profile-time calibration adjustments (i.e.,
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
475 # 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
476 # more carefully the number of events (and cumulatively, the number
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
477 # of events during sub functions) that are seen. If this were
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
478 # 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
479 # display time). Currently, we track only call/return events.
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
480 # These values can be deduced by examining the callees and callers
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
481 # vectors for each functions. Hence we *can* almost correct the
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
482 # 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
483 # track exception event processing counts). Unfortunately, there
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
484 # is currently no similar information for cumulative sub-function
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
485 # 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
486 # time. Specifically, we would have to extend the tuples to keep
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
487 # 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
488 # 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
489 # that this additional feature will slow the heavily optimized
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
490 # 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
491 # low "value added" feature.)
010d03853546 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 13912
diff changeset
492 #**************************************************************
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
493
20324
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
494 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
495 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
496 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
497
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
498 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
499 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
500 try:
20350
0a915b22e006 Repair key stutter + auto-complete ugliness.
Tim Peters <tim.peters@gmail.com>
parents: 20347
diff changeset
501 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
502 finally:
b79ffd3fca28 Allow the profiler's calibration constant to be specified in the constructor
Tim Peters <tim.peters@gmail.com>
parents: 20324
diff changeset
503 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
504
20350
0a915b22e006 Repair key stutter + auto-complete ugliness.
Tim Peters <tim.peters@gmail.com>
parents: 20347
diff changeset
505 def _calibrate_inner(self, m, verbose):
18056
a232a6c3fc8c Performance improvements to the profiler:
Fred Drake <fdrake@acm.org>
parents: 17042
diff changeset
506 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
507
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
508 # 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
509 # 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
510 # 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
511 # 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
512 # 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
513
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
514 def f1(n):
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
515 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
516 x = 1
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
517
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
518 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
519 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
520 f1(100)
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
521
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
522 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
523
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
524 # 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
525 t0 = get_time()
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
526 f(m)
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
527 t1 = get_time()
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
528 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
529 if verbose:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 39782
diff changeset
530 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
531
20324
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
532 # 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
533 # 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
534 # 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
535 p = Profile()
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
536 t0 = get_time()
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
537 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
538 t1 = get_time()
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
539 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
540 if verbose:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 39782
diff changeset
541 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
542
20324
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
543 # 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
544 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
545 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
546 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
547 p.timings.items():
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
548 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
549 total_calls += cc
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
550 reported_time += tt
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
551
20324
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
552 if verbose:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 39782
diff changeset
553 print("'CPU seconds' profiler reported =", reported_time)
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 39782
diff changeset
554 print("total # calls =", total_calls)
20324
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
555 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
556 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
557
20324
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
558 # 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
559 # 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
560 # 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
561 # overhead per event.
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
562 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
563 if verbose:
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 39782
diff changeset
564 print("mean stopwatch overhead per profile event =", mean)
20324
429a08e2fc78 A brand new implementation of Profile.calibrate(). This measures an
Tim Peters <tim.peters@gmail.com>
parents: 20302
diff changeset
565 return mean
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
566
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
567 #****************************************************************************
4347
a5c29accc438 Add main program similar to pdb.
Guido van Rossum <guido@python.org>
parents: 3634
diff changeset
568
34375
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
569 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
570 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
571 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
572 parser.allow_interspersed_args = False
32528
67539cfcf09f Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 31796
diff changeset
573 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
574 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
575 parser.add_option('-s', '--sort', dest="sort",
65115
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
diff changeset
576 help="Sort order when printing to stdout, based on pstats.Stats class",
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
diff changeset
577 default=-1)
34388
598d16fa02c1 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34382
diff changeset
578
34375
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
579 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
580 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
581 sys.exit(2)
34388
598d16fa02c1 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34382
diff changeset
582
31782
6a1505613358 Added command line options for profile.py - one for stats output file
Nicholas Bastin <nick.bastin@gmail.com>
parents: 31770
diff changeset
583 (options, args) = parser.parse_args()
65115
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
diff changeset
584 sys.argv[:] = args
34388
598d16fa02c1 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 34382
diff changeset
585
65115
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
diff changeset
586 if len(args) > 0:
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
diff changeset
587 progname = args[0]
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
diff changeset
588 sys.path.insert(0, os.path.dirname(progname))
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
diff changeset
589 with open(progname, 'rb') as fp:
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
diff changeset
590 code = compile(fp.read(), progname, 'exec')
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
diff changeset
591 globs = {
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
diff changeset
592 '__file__': progname,
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
diff changeset
593 '__name__': '__main__',
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
diff changeset
594 '__package__': None,
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
diff changeset
595 '__cached__': None,
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
diff changeset
596 }
b9a75dd7420d Merged revisions 82805-82806,83523-83527,83536,83538,83542,83546-83548,83550-83555,83558,83560 via svnmerge from
Georg Brandl <georg@python.org>
parents: 59889
diff changeset
597 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
598 else:
34375
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
599 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
600 return parser
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
601
c5975433aa68 Move code in __name__ == '__main__' block into main() function, rewrite code so
Johannes Gijsbers <jlg@dds.nl>
parents: 32642
diff changeset
602 # 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
603 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
604 main()