[Python-checkins] r70718 - python/branches/py3k/Lib/importlib/test/benchmark.py

brett.cannon python-checkins at python.org
Mon Mar 30 17:53:01 CEST 2009


Author: brett.cannon
Date: Mon Mar 30 17:53:01 2009
New Revision: 70718

Log:
Add simple tests for __import__ for future optimizations to importlib.

Added:
   python/branches/py3k/Lib/importlib/test/benchmark.py

Added: python/branches/py3k/Lib/importlib/test/benchmark.py
==============================================================================
--- (empty file)
+++ python/branches/py3k/Lib/importlib/test/benchmark.py	Mon Mar 30 17:53:01 2009
@@ -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_)


More information about the Python-checkins mailing list