diff options
author | Brett Cannon <bcannon@gmail.com> | 2009-03-30 15:53:01 (GMT) |
---|---|---|
committer | Brett Cannon <bcannon@gmail.com> | 2009-03-30 15:53:01 (GMT) |
commit | 6ae7a7d13d2f1497b197f7d1c798536e3abd8b7a (patch) | |
tree | c58c1b19f6ca740adee0433a40a4cc3bdaf43478 /Lib/importlib/test/benchmark.py | |
parent | ded31c47af85e51ff17a0f8539a0507d791a4c71 (diff) | |
download | cpython-6ae7a7d13d2f1497b197f7d1c798536e3abd8b7a.zip cpython-6ae7a7d13d2f1497b197f7d1c798536e3abd8b7a.tar.gz cpython-6ae7a7d13d2f1497b197f7d1c798536e3abd8b7a.tar.bz2 |
Add simple tests for __import__ for future optimizations to importlib.
Diffstat (limited to 'Lib/importlib/test/benchmark.py')
-rw-r--r-- | Lib/importlib/test/benchmark.py | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/Lib/importlib/test/benchmark.py b/Lib/importlib/test/benchmark.py new file mode 100644 index 0000000..f709a3c --- /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 = '<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_) |