annotate Tools/scripts/gprof2html.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 354e4d096c34
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
83472
354e4d096c34 Issue #17801: fix shebang line of gprof2html.py
Ned Deily <nad@acm.org>
parents: 76250
diff changeset
1 #! /usr/bin/env python3
24721
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 """Transform gprof(1) output into useful HTML."""
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 import re, os, sys, cgi, webbrowser
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 header = """\
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 <html>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 <head>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 <title>gprof output (%s)</title>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 </head>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 <body>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 <pre>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 """
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
15
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 trailer = """\
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 </pre>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 </body>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 </html>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 """
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
76250
4d603d6782db #14508: make gprof2html script runnable under python3
R David Murray <rdmurray@bitdance.com>
parents: 59522
diff changeset
22 def add_escapes(filename):
4d603d6782db #14508: make gprof2html script runnable under python3
R David Murray <rdmurray@bitdance.com>
parents: 59522
diff changeset
23 with open(filename) as fp:
4d603d6782db #14508: make gprof2html script runnable under python3
R David Murray <rdmurray@bitdance.com>
parents: 59522
diff changeset
24 for line in fp:
4d603d6782db #14508: make gprof2html script runnable under python3
R David Murray <rdmurray@bitdance.com>
parents: 59522
diff changeset
25 yield cgi.escape(line)
4d603d6782db #14508: make gprof2html script runnable under python3
R David Murray <rdmurray@bitdance.com>
parents: 59522
diff changeset
26
24721
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
27
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 def main():
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 filename = "gprof.out"
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 if sys.argv[1:]:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 filename = sys.argv[1]
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 outputfilename = filename + ".html"
76250
4d603d6782db #14508: make gprof2html script runnable under python3
R David Murray <rdmurray@bitdance.com>
parents: 59522
diff changeset
33 input = add_escapes(filename)
4d603d6782db #14508: make gprof2html script runnable under python3
R David Murray <rdmurray@bitdance.com>
parents: 59522
diff changeset
34 output = open(outputfilename, "w")
24721
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 output.write(header % filename)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 for line in input:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 output.write(line)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 if line.startswith(" time"):
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 break
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 labels = {}
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 for line in input:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 m = re.match(r"(.* )(\w+)\n", line)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 if not m:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 output.write(line)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 break
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 stuff, fname = m.group(1, 2)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 labels[fname] = fname
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 output.write('%s<a name="flat:%s" href="#call:%s">%s</a>\n' %
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 (stuff, fname, fname, fname))
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 for line in input:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 output.write(line)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 if line.startswith("index % time"):
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 break
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 for line in input:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 m = re.match(r"(.* )(\w+)(( &lt;cycle.*&gt;)? \[\d+\])\n", line)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 if not m:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 output.write(line)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 if line.startswith("Index by function name"):
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 break
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 continue
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 prefix, fname, suffix = m.group(1, 2, 3)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 if fname not in labels:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 output.write(line)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 continue
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 if line.startswith("["):
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 output.write('%s<a name="call:%s" href="#flat:%s">%s</a>%s\n' %
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 (prefix, fname, fname, fname, suffix))
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 else:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 output.write('%s<a href="#call:%s">%s</a>%s\n' %
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 (prefix, fname, fname, suffix))
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 for line in input:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 for part in re.findall(r"(\w+(?:\.c)?|\W+)", line):
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 if part in labels:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 part = '<a href="#call:%s">%s</a>' % (part, part)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 output.write(part)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 output.write(trailer)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 output.close()
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 webbrowser.open("file:" + os.path.abspath(outputfilename))
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
79
33074
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 24721
diff changeset
80 if __name__ == '__main__':
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 24721
diff changeset
81 main()