mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
	
	
		
			83 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			83 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from . import util
							 | 
						||
| 
								 | 
							
								from .source import util as source_util
							 | 
						||
| 
								 | 
							
								import gc
							 | 
						||
| 
								 | 
							
								import decimal
							 | 
						||
| 
								 | 
							
								import imp
							 | 
						||
| 
								 | 
							
								import importlib
							 | 
						||
| 
								 | 
							
								import sys
							 | 
						||
| 
								 | 
							
								import timeit
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def bench_cache(import_, repeat, number):
							 | 
						||
| 
								 | 
							
								    """Measure the time it takes to pull from sys.modules."""
							 | 
						||
| 
								 | 
							
								    name = '<benchmark import>'
							 | 
						||
| 
								 | 
							
								    with util.uncache(name):
							 | 
						||
| 
								 | 
							
								        module = imp.new_module(name)
							 | 
						||
| 
								 | 
							
								        sys.modules[name] = module
							 | 
						||
| 
								 | 
							
								        runs = []
							 | 
						||
| 
								 | 
							
								        for x in range(repeat):
							 | 
						||
| 
								 | 
							
								            start_time = timeit.default_timer()
							 | 
						||
| 
								 | 
							
								            for y in range(number):
							 | 
						||
| 
								 | 
							
								                import_(name)
							 | 
						||
| 
								 | 
							
								            end_time = timeit.default_timer()
							 | 
						||
| 
								 | 
							
								            runs.append(end_time - start_time)
							 | 
						||
| 
								 | 
							
								        return min(runs)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def bench_importing_source(import_, repeat, number, loc=100000):
							 | 
						||
| 
								 | 
							
								    """Measure importing source from disk.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    For worst-case scenario, the line endings are \\r\\n and thus require
							 | 
						||
| 
								 | 
							
								    universal newline translation.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    name = '__benchmark'
							 | 
						||
| 
								 | 
							
								    with source_util.create_modules(name) as mapping:
							 | 
						||
| 
								 | 
							
								        with open(mapping[name], 'w') as file:
							 | 
						||
| 
								 | 
							
								            for x in range(loc):
							 | 
						||
| 
								 | 
							
								                file.write("{0}\r\n".format(x))
							 | 
						||
| 
								 | 
							
								        with util.import_state(path=[mapping['.root']]):
							 | 
						||
| 
								 | 
							
								            runs = []
							 | 
						||
| 
								 | 
							
								            for x in range(repeat):
							 | 
						||
| 
								 | 
							
								                start_time = timeit.default_timer()
							 | 
						||
| 
								 | 
							
								                for y in range(number):
							 | 
						||
| 
								 | 
							
								                    try:
							 | 
						||
| 
								 | 
							
								                        import_(name)
							 | 
						||
| 
								 | 
							
								                    finally:
							 | 
						||
| 
								 | 
							
								                        del sys.modules[name]
							 | 
						||
| 
								 | 
							
								                end_time = timeit.default_timer()
							 | 
						||
| 
								 | 
							
								                runs.append(end_time - start_time)
							 | 
						||
| 
								 | 
							
								            return min(runs)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def main(import_):
							 | 
						||
| 
								 | 
							
								    args = [('sys.modules', bench_cache, 5, 500000),
							 | 
						||
| 
								 | 
							
								            ('source', bench_importing_source, 5, 10000)]
							 | 
						||
| 
								 | 
							
								    test_msg = "{test}, {number} times (best of {repeat}):"
							 | 
						||
| 
								 | 
							
								    result_msg = "{result:.2f} secs"
							 | 
						||
| 
								 | 
							
								    gc.disable()
							 | 
						||
| 
								 | 
							
								    try:
							 | 
						||
| 
								 | 
							
								        for name, meth, repeat, number in args:
							 | 
						||
| 
								 | 
							
								            result = meth(import_, repeat, number)
							 | 
						||
| 
								 | 
							
								            print(test_msg.format(test=name, repeat=repeat,
							 | 
						||
| 
								 | 
							
								                    number=number).ljust(40),
							 | 
						||
| 
								 | 
							
								                    result_msg.format(result=result).rjust(10))
							 | 
						||
| 
								 | 
							
								    finally:
							 | 
						||
| 
								 | 
							
								        gc.enable()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == '__main__':
							 | 
						||
| 
								 | 
							
								    import optparse
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    parser = optparse.OptionParser()
							 | 
						||
| 
								 | 
							
								    parser.add_option('-b', '--builtin', dest='builtin', action='store_true',
							 | 
						||
| 
								 | 
							
								                        default=False, help="use the built-in __import__")
							 | 
						||
| 
								 | 
							
								    options, args = parser.parse_args()
							 | 
						||
| 
								 | 
							
								    if args:
							 | 
						||
| 
								 | 
							
								        raise RuntimeError("unrecognized args: {0}".format(args))
							 | 
						||
| 
								 | 
							
								    import_ = __import__
							 | 
						||
| 
								 | 
							
								    if not options.builtin:
							 | 
						||
| 
								 | 
							
								        import_ = importlib.__import__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    main(import_)
							 |