mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	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. ........
		
			
				
	
	
		
			134 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			134 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()
 |