annotate Lib/profile.py @ 79691:05c8928362ee

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