diff options
Diffstat (limited to 'Lib/importlib/test/benchmark.py')
| -rw-r--r-- | Lib/importlib/test/benchmark.py | 172 | 
1 files changed, 0 insertions, 172 deletions
| diff --git a/Lib/importlib/test/benchmark.py b/Lib/importlib/test/benchmark.py deleted file mode 100644 index b5de6c6..0000000 --- a/Lib/importlib/test/benchmark.py +++ /dev/null @@ -1,172 +0,0 @@ -"""Benchmark some basic import use-cases. - -The assumption is made that this benchmark is run in a fresh interpreter and -thus has no external changes made to import-related attributes in sys. - -""" -from . import util -from .source import util as source_util -import decimal -import imp -import importlib -import os -import py_compile -import sys -import timeit - - -def bench(name, cleanup=lambda: None, *, seconds=1, repeat=3): -    """Bench the given statement as many times as necessary until total -    executions take one second.""" -    stmt = "__import__({!r})".format(name) -    timer = timeit.Timer(stmt) -    for x in range(repeat): -        total_time = 0 -        count = 0 -        while total_time < seconds: -            try: -                total_time += timer.timeit(1) -            finally: -                cleanup() -            count += 1 -        else: -            # One execution too far -            if total_time > seconds: -                count -= 1 -        yield count // seconds - -def from_cache(seconds, repeat): -    """sys.modules""" -    name = '<benchmark import>' -    module = imp.new_module(name) -    module.__file__ = '<test>' -    module.__package__ = '' -    with util.uncache(name): -        sys.modules[name] = module -        for result in bench(name, repeat=repeat, seconds=seconds): -            yield result - - -def builtin_mod(seconds, repeat): -    """Built-in module""" -    name = 'errno' -    if name in sys.modules: -        del sys.modules[name] -    # Relying on built-in importer being implicit. -    for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat, -                        seconds=seconds): -        yield result - - -def source_wo_bytecode(seconds, repeat): -    """Source w/o bytecode: simple""" -    sys.dont_write_bytecode = True -    try: -        name = '__importlib_test_benchmark__' -        # Clears out sys.modules and puts an entry at the front of sys.path. -        with source_util.create_modules(name) as mapping: -            assert not os.path.exists(imp.cache_from_source(mapping[name])) -            for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat, -                                seconds=seconds): -                yield result -    finally: -        sys.dont_write_bytecode = False - - -def decimal_wo_bytecode(seconds, repeat): -    """Source w/o bytecode: decimal""" -    name = 'decimal' -    decimal_bytecode = imp.cache_from_source(decimal.__file__) -    if os.path.exists(decimal_bytecode): -        os.unlink(decimal_bytecode) -    sys.dont_write_bytecode = True -    try: -        for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat, -                            seconds=seconds): -            yield result -    finally: -        sys.dont_write_bytecode = False - - -def source_writing_bytecode(seconds, repeat): -    """Source writing bytecode: simple""" -    assert not sys.dont_write_bytecode -    name = '__importlib_test_benchmark__' -    with source_util.create_modules(name) as mapping: -        def cleanup(): -            sys.modules.pop(name) -            os.unlink(imp.cache_from_source(mapping[name])) -        for result in bench(name, cleanup, repeat=repeat, seconds=seconds): -            assert not os.path.exists(imp.cache_from_source(mapping[name])) -            yield result - - -def decimal_writing_bytecode(seconds, repeat): -    """Source writing bytecode: decimal""" -    assert not sys.dont_write_bytecode -    name = 'decimal' -    def cleanup(): -        sys.modules.pop(name) -        os.unlink(imp.cache_from_source(decimal.__file__)) -    for result in bench(name, cleanup, repeat=repeat, seconds=seconds): -        yield result - - -def source_using_bytecode(seconds, repeat): -    """Bytecode w/ source: simple""" -    name = '__importlib_test_benchmark__' -    with source_util.create_modules(name) as mapping: -        py_compile.compile(mapping[name]) -        assert os.path.exists(imp.cache_from_source(mapping[name])) -        for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat, -                            seconds=seconds): -            yield result - - -def decimal_using_bytecode(seconds, repeat): -    """Bytecode w/ source: decimal""" -    name = 'decimal' -    py_compile.compile(decimal.__file__) -    for result in bench(name, lambda: sys.modules.pop(name), repeat=repeat, -                        seconds=seconds): -        yield result - - -def main(import_): -    __builtins__.__import__ = import_ -    benchmarks = (from_cache, builtin_mod, -                  source_using_bytecode, source_wo_bytecode, -                  source_writing_bytecode, -                  decimal_using_bytecode, decimal_writing_bytecode, -                  decimal_wo_bytecode,) -    seconds = 1 -    seconds_plural = 's' if seconds > 1 else '' -    repeat = 3 -    header = "Measuring imports/second over {} second{}, best out of {}\n" -    print(header.format(seconds, seconds_plural, repeat)) -    for benchmark in benchmarks: -        print(benchmark.__doc__, "[", end=' ') -        sys.stdout.flush() -        results = [] -        for result in benchmark(seconds=seconds, repeat=repeat): -            results.append(result) -            print(result, end=' ') -            sys.stdout.flush() -        assert not sys.dont_write_bytecode -        print("]", "best is", format(max(results), ',d')) - - -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: {}".format(args)) -    import_ = __import__ -    if not options.builtin: -        import_ = importlib.__import__ - -    main(import_) | 
