mirror of
https://github.com/python/cpython.git
synced 2024-12-18 22:34:08 +08:00
dae2a8939d
svn+ssh://pythondev@svn.python.org/python/trunk ........ r62350 | nick.coghlan | 2008-04-15 12:25:31 +0200 (Tue, 15 Apr 2008) | 1 line Issue 2439: add pkgutils.get_data() as a convenience wrapper for the PEP 302 get_data() API (contributed by Paul Moore) ........ r62351 | nick.coghlan | 2008-04-15 12:28:14 +0200 (Tue, 15 Apr 2008) | 1 line Add test file missing from rev 62350 ........ r62352 | benjamin.peterson | 2008-04-15 13:58:46 +0200 (Tue, 15 Apr 2008) | 2 lines Add myself to Doc/ACKS.txt ........ r62353 | andrew.kuchling | 2008-04-15 15:10:07 +0200 (Tue, 15 Apr 2008) | 6 lines Add *,**,@ to index, as suggested by http://farmdev.com/thoughts/24/what-does-the-def-star-variable-or-def-asterisk-parameter-syntax-do-in-python-/ The right entry type to use isn't clear; operator seems wrong, because *,**,@ aren't being used in expressions here. I put them as 'statement'; 'syntax' might be better. ........ r62354 | andrew.kuchling | 2008-04-15 15:10:41 +0200 (Tue, 15 Apr 2008) | 1 line Typo fix ........ r62355 | mark.dickinson | 2008-04-15 22:51:18 +0200 (Tue, 15 Apr 2008) | 3 lines Fix for possible signed overflow: the behaviour of -LONG_MIN is undefined in ANSI C. ........ r62358 | jeroen.ruigrok | 2008-04-16 14:47:01 +0200 (Wed, 16 Apr 2008) | 2 lines Reformat to 80 columns prior to adding documentation. ........ r62359 | jeroen.ruigrok | 2008-04-16 14:57:43 +0200 (Wed, 16 Apr 2008) | 2 lines Add details about the return value for mmap.flush(). ........ r62364 | raymond.hettinger | 2008-04-17 12:48:31 +0200 (Thu, 17 Apr 2008) | 1 line Issue 2648: Add leading zero to money format recipe in the docs. ........ r62365 | jeroen.ruigrok | 2008-04-17 14:39:45 +0200 (Thu, 17 Apr 2008) | 2 lines Be consistent in the use of read-only. ........ r62370 | andrew.kuchling | 2008-04-17 22:44:06 +0200 (Thu, 17 Apr 2008) | 1 line Typo fixes ........ r62372 | andrew.kuchling | 2008-04-18 04:40:47 +0200 (Fri, 18 Apr 2008) | 1 line Use correct parameter name ........ r62373 | andrew.kuchling | 2008-04-18 18:53:09 +0200 (Fri, 18 Apr 2008) | 1 line #2654: fix typo ........ r62374 | andrew.kuchling | 2008-04-18 20:28:23 +0200 (Fri, 18 Apr 2008) | 4 lines Remove personal note from Jim Roskind; it no longer applies, and the e-mail address is for a previous employer. Can we move the big long copyright statement into a sidebar or something? ........ r62375 | andrew.kuchling | 2008-04-18 20:39:55 +0200 (Fri, 18 Apr 2008) | 1 line Rewrite introductory section, and remove old section. (It was already commented-out, but why keep it?) ........ r62378 | skip.montanaro | 2008-04-18 22:35:46 +0200 (Fri, 18 Apr 2008) | 1 line resolve issue 2014 ........ r62379 | benjamin.peterson | 2008-04-18 22:45:33 +0200 (Fri, 18 Apr 2008) | 2 lines Fix indentation in sysmodule.c ........ r62381 | amaury.forgeotdarc | 2008-04-19 01:31:33 +0200 (Sat, 19 Apr 2008) | 3 lines Some tests did not pass on repeated calls (regrtest -R::) Perform additional cleanup, mostly deleting from sys.modules, or clearing the warnings registry. ........
135 lines
5.9 KiB
Python
Executable File
135 lines
5.9 KiB
Python
Executable File
"""Test suite for the profile module."""
|
|
|
|
import os
|
|
import sys
|
|
import pstats
|
|
import unittest
|
|
from difflib import unified_diff
|
|
from io import StringIO
|
|
from test.test_support import run_unittest
|
|
|
|
import profile
|
|
from test.profilee import testfunc, timer
|
|
|
|
|
|
class ProfileTest(unittest.TestCase):
|
|
|
|
profilerclass = profile.Profile
|
|
methodnames = ['print_stats', 'print_callers', 'print_callees']
|
|
expected_output = {}
|
|
|
|
@classmethod
|
|
def do_profiling(cls):
|
|
results = []
|
|
prof = cls.profilerclass(timer, 0.001)
|
|
start_timer = timer()
|
|
prof.runctx("testfunc()", globals(), locals())
|
|
results.append(timer() - start_timer)
|
|
for methodname in cls.methodnames:
|
|
s = StringIO()
|
|
stats = pstats.Stats(prof, stream=s)
|
|
stats.strip_dirs().sort_stats("stdname")
|
|
getattr(stats, methodname)()
|
|
output = s.getvalue().splitlines()
|
|
mod_name = testfunc.__module__.rsplit('.', 1)[1]
|
|
# Only compare against stats originating from the test file.
|
|
# Prevents outside code (e.g., the io module) from causing
|
|
# unexpected output.
|
|
output = [line.rstrip() for line in output if mod_name in line]
|
|
results.append('\n'.join(output))
|
|
return results
|
|
|
|
def test_cprofile(self):
|
|
results = self.do_profiling()
|
|
self.assertEqual(results[0], 1000)
|
|
for i, method in enumerate(self.methodnames):
|
|
if results[i+1] != self.expected_output[method]:
|
|
print("Stats.%s output for %s doesn't fit expectation!" %
|
|
(method, self.profilerclass.__name__))
|
|
print('\n'.join(unified_diff(
|
|
results[i+1].split('\n'),
|
|
self.expected_output[method].split('\n'))))
|
|
|
|
|
|
def regenerate_expected_output(filename, cls):
|
|
filename = filename.rstrip('co')
|
|
print('Regenerating %s...' % filename)
|
|
results = cls.do_profiling()
|
|
|
|
newfile = []
|
|
with open(filename, 'r') as f:
|
|
for line in f:
|
|
newfile.append(line)
|
|
if line.startswith('#--cut'):
|
|
break
|
|
|
|
with open(filename, 'w') as f:
|
|
f.writelines(newfile)
|
|
for i, method in enumerate(cls.methodnames):
|
|
f.write('%s.expected_output[%r] = """\\\n%s"""\n' % (
|
|
cls.__name__, method, results[i+1]))
|
|
f.write('\nif __name__ == "__main__":\n main()\n')
|
|
|
|
|
|
def test_main():
|
|
run_unittest(ProfileTest)
|
|
|
|
def main():
|
|
if '-r' not in sys.argv:
|
|
test_main()
|
|
else:
|
|
regenerate_expected_output(__file__, ProfileTest)
|
|
|
|
|
|
# Don't remove this comment. Everything below it is auto-generated.
|
|
#--cut--------------------------------------------------------------------------
|
|
ProfileTest.expected_output['print_stats'] = """\
|
|
28 27.972 0.999 27.972 0.999 profilee.py:110(__getattr__)
|
|
1 269.996 269.996 999.769 999.769 profilee.py:25(testfunc)
|
|
23/3 149.937 6.519 169.917 56.639 profilee.py:35(factorial)
|
|
20 19.980 0.999 19.980 0.999 profilee.py:48(mul)
|
|
2 39.986 19.993 599.830 299.915 profilee.py:55(helper)
|
|
4 115.984 28.996 119.964 29.991 profilee.py:73(helper1)
|
|
2 -0.006 -0.003 139.946 69.973 profilee.py:84(helper2_indirect)
|
|
8 311.976 38.997 399.912 49.989 profilee.py:88(helper2)
|
|
8 63.976 7.997 79.960 9.995 profilee.py:98(subhelper)"""
|
|
ProfileTest.expected_output['print_callers'] = """\
|
|
:0(append) <- profilee.py:73(helper1)(4) 119.964
|
|
:0(exc_info) <- profilee.py:73(helper1)(4) 119.964
|
|
:0(hasattr) <- profilee.py:73(helper1)(4) 119.964
|
|
profilee.py:88(helper2)(8) 399.912
|
|
profilee.py:110(__getattr__) <- :0(hasattr)(12) 11.964
|
|
profilee.py:98(subhelper)(16) 79.960
|
|
profilee.py:25(testfunc) <- <string>:1(<module>)(1) 999.767
|
|
profilee.py:35(factorial) <- profilee.py:25(testfunc)(1) 999.769
|
|
profilee.py:35(factorial)(20) 169.917
|
|
profilee.py:84(helper2_indirect)(2) 139.946
|
|
profilee.py:48(mul) <- profilee.py:35(factorial)(20) 169.917
|
|
profilee.py:55(helper) <- profilee.py:25(testfunc)(2) 999.769
|
|
profilee.py:73(helper1) <- profilee.py:55(helper)(4) 599.830
|
|
profilee.py:84(helper2_indirect) <- profilee.py:55(helper)(2) 599.830
|
|
profilee.py:88(helper2) <- profilee.py:55(helper)(6) 599.830
|
|
profilee.py:84(helper2_indirect)(2) 139.946
|
|
profilee.py:98(subhelper) <- profilee.py:88(helper2)(8) 399.912"""
|
|
ProfileTest.expected_output['print_callees'] = """\
|
|
:0(hasattr) -> profilee.py:110(__getattr__)(12) 27.972
|
|
<string>:1(<module>) -> profilee.py:25(testfunc)(1) 999.769
|
|
profilee.py:110(__getattr__) ->
|
|
profilee.py:25(testfunc) -> profilee.py:35(factorial)(1) 169.917
|
|
profilee.py:55(helper)(2) 599.830
|
|
profilee.py:35(factorial) -> profilee.py:35(factorial)(20) 169.917
|
|
profilee.py:48(mul)(20) 19.980
|
|
profilee.py:48(mul) ->
|
|
profilee.py:55(helper) -> profilee.py:73(helper1)(4) 119.964
|
|
profilee.py:84(helper2_indirect)(2) 139.946
|
|
profilee.py:88(helper2)(6) 399.912
|
|
profilee.py:73(helper1) -> :0(append)(4) -0.004
|
|
profilee.py:84(helper2_indirect) -> profilee.py:35(factorial)(2) 169.917
|
|
profilee.py:88(helper2)(2) 399.912
|
|
profilee.py:88(helper2) -> :0(hasattr)(8) 11.964
|
|
profilee.py:98(subhelper)(8) 79.960
|
|
profilee.py:98(subhelper) -> profilee.py:110(__getattr__)(16) 27.972"""
|
|
|
|
if __name__ == "__main__":
|
|
main()
|