From 6ae7a7d13d2f1497b197f7d1c798536e3abd8b7a Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Mon, 30 Mar 2009 15:53:01 +0000 Subject: [PATCH] Add simple tests for __import__ for future optimizations to importlib. --- Lib/importlib/test/benchmark.py | 82 +++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 Lib/importlib/test/benchmark.py diff --git a/Lib/importlib/test/benchmark.py b/Lib/importlib/test/benchmark.py new file mode 100644 index 00000000000..f709a3cce91 --- /dev/null +++ b/Lib/importlib/test/benchmark.py @@ -0,0 +1,82 @@ +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 = '' + 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_)