equal
deleted
inserted
replaced
7 |
7 |
8 # PyPy doesn't expose profiler_entry from the module. |
8 # PyPy doesn't expose profiler_entry from the module. |
9 profiler_entry = getattr(_lsprof, 'profiler_entry', None) |
9 profiler_entry = getattr(_lsprof, 'profiler_entry', None) |
10 |
10 |
11 __all__ = ['profile', 'Stats'] |
11 __all__ = ['profile', 'Stats'] |
|
12 |
12 |
13 |
13 def profile(f, *args, **kwds): |
14 def profile(f, *args, **kwds): |
14 """XXX docstring""" |
15 """XXX docstring""" |
15 p = Profiler() |
16 p = Profiler() |
16 p.enable(subcalls=True, builtins=True) |
17 p.enable(subcalls=True, builtins=True) |
48 d = self.data |
49 d = self.data |
49 if top is not None: |
50 if top is not None: |
50 d = d[:top] |
51 d = d[:top] |
51 cols = "% 12d %12d %11.4f %11.4f %s\n" |
52 cols = "% 12d %12d %11.4f %11.4f %s\n" |
52 hcols = "% 12s %12s %12s %12s %s\n" |
53 hcols = "% 12s %12s %12s %12s %s\n" |
53 file.write(hcols % ("CallCount", "Recursive", "Total(s)", |
54 file.write( |
54 "Inline(s)", "module:lineno(function)")) |
55 hcols |
|
56 % ( |
|
57 "CallCount", |
|
58 "Recursive", |
|
59 "Total(s)", |
|
60 "Inline(s)", |
|
61 "module:lineno(function)", |
|
62 ) |
|
63 ) |
55 count = 0 |
64 count = 0 |
56 for e in d: |
65 for e in d: |
57 file.write(cols % (e.callcount, e.reccallcount, e.totaltime, |
66 file.write( |
58 e.inlinetime, label(e.code))) |
67 cols |
|
68 % ( |
|
69 e.callcount, |
|
70 e.reccallcount, |
|
71 e.totaltime, |
|
72 e.inlinetime, |
|
73 label(e.code), |
|
74 ) |
|
75 ) |
59 count += 1 |
76 count += 1 |
60 if limit is not None and count == limit: |
77 if limit is not None and count == limit: |
61 return |
78 return |
62 ccount = 0 |
79 ccount = 0 |
63 if climit and e.calls: |
80 if climit and e.calls: |
64 for se in e.calls: |
81 for se in e.calls: |
65 file.write(cols % (se.callcount, se.reccallcount, |
82 file.write( |
66 se.totaltime, se.inlinetime, |
83 cols |
67 " %s" % label(se.code))) |
84 % ( |
|
85 se.callcount, |
|
86 se.reccallcount, |
|
87 se.totaltime, |
|
88 se.inlinetime, |
|
89 " %s" % label(se.code), |
|
90 ) |
|
91 ) |
68 count += 1 |
92 count += 1 |
69 ccount += 1 |
93 ccount += 1 |
70 if limit is not None and count == limit: |
94 if limit is not None and count == limit: |
71 return |
95 return |
72 if climit is not None and ccount == climit: |
96 if climit is not None and ccount == climit: |
85 for j in range(len(e.calls)): |
109 for j in range(len(e.calls)): |
86 se = e.calls[j] |
110 se = e.calls[j] |
87 if not isinstance(se.code, str): |
111 if not isinstance(se.code, str): |
88 e.calls[j] = type(se)((label(se.code),) + se[1:]) |
112 e.calls[j] = type(se)((label(se.code),) + se[1:]) |
89 |
113 |
|
114 |
90 _fn2mod = {} |
115 _fn2mod = {} |
|
116 |
91 |
117 |
92 def label(code): |
118 def label(code): |
93 if isinstance(code, str): |
119 if isinstance(code, str): |
94 if sys.version_info.major >= 3: |
120 if sys.version_info.major >= 3: |
95 code = code.encode('latin-1') |
121 code = code.encode('latin-1') |
113 if sys.version_info.major >= 3: |
139 if sys.version_info.major >= 3: |
114 res = res.encode('latin-1') |
140 res = res.encode('latin-1') |
115 |
141 |
116 return res |
142 return res |
117 |
143 |
|
144 |
118 if __name__ == '__main__': |
145 if __name__ == '__main__': |
119 import os |
146 import os |
|
147 |
120 sys.argv = sys.argv[1:] |
148 sys.argv = sys.argv[1:] |
121 if not sys.argv: |
149 if not sys.argv: |
122 print("usage: lsprof.py <script> <arguments...>", file=sys.stderr) |
150 print("usage: lsprof.py <script> <arguments...>", file=sys.stderr) |
123 sys.exit(2) |
151 sys.exit(2) |
124 sys.path.insert(0, os.path.abspath(os.path.dirname(sys.argv[0]))) |
152 sys.path.insert(0, os.path.abspath(os.path.dirname(sys.argv[0]))) |