[Python-checkins] r53059 - sandbox/trunk/import_in_py/importbench.py

brett.cannon python-checkins at python.org
Mon Dec 18 23:07:09 CET 2006


Author: brett.cannon
Date: Mon Dec 18 23:07:08 2006
New Revision: 53059

Modified:
   sandbox/trunk/import_in_py/importbench.py
Log:
Add tests for importing Python modules.

Also clean up output.


Modified: sandbox/trunk/import_in_py/importbench.py
==============================================================================
--- sandbox/trunk/import_in_py/importbench.py	(original)
+++ sandbox/trunk/import_in_py/importbench.py	Mon Dec 18 23:07:08 2006
@@ -41,11 +41,11 @@
         """Create requested files."""
         self.directory = tempfile.gettempdir()
         self.py_path = os.path.join(self.directory, self.module_name + '.py')
+        self.pyc_path = self.py_path + ('c' if __debug__ else 'o')
         with open(self.py_path, 'w') as py_file:
             py_file.write("# Temporary file for benchmarking import.")
         if self.pyc:
             compile_to_pyc(self.py_path, doraise=True)
-            self.pyc_path = self.py_path + ('c' if __debug__ else 'o')
         if not self.py:
             os.remove(self.py_path)
         sys.path.append(self.directory)
@@ -53,9 +53,9 @@
         
     def __exit__(self, *args):
         """Clean up created state."""
-        if self.py:
+        if os.path.exists(self.py_path):
             os.remove(self.py_path)
-        if self.pyc:
+        if os.path.exists(self.pyc_path):
             os.remove(self.pyc_path)
 
 
@@ -65,10 +65,10 @@
     sys.path = []
     sys.meta_path = []
     sys.path_importer_cache.clear()
-    with PyPycFiles() as py_pyc_state:
+    with PyPycFiles() as file_state:
         # Force the module into sys.modules .
-        __import__(py_pyc_state.module_name, {})
-        timer = Timer("__import__(%r, {}, {}, [], 0)" % py_pyc_state.module_name)
+        __import__(file_state.module_name, {})
+        timer = Timer("__import__(%r, {}, {}, [], 0)" % file_state.module_name)
         return timer.repeat(repeat, times)
 
 @save_import_state
@@ -90,14 +90,43 @@
         timer = Timer("try:__import__(%r, {}, {}, [], 0)\nexcept ImportError:pass" %
                         bad_name)
         return timer.repeat(repeat, times)
-    
-    
+
+def py_pyc_module_benchmark(py, pyc):
+    @save_import_state
+    def inner(times, repeat):
+        sys.path = []
+        sys.meta_path = []
+        with PyPycFiles(py, pyc) as file_state:
+            import_stmt = ("__import__(%(module)r, {}, {}, [], 0);"
+                            "del sys.modules[%(module)r]")
+            import_stmt = import_stmt % {'module':file_state.module_name}
+            # Warm up path_importer_cache.
+            exec import_stmt in globals(), {}
+            # Benchmark.
+            timer = Timer(import_stmt, "import sys")
+            return timer.repeat(repeat, times)
+    return inner
+     
+bench_pyc_with_py = py_pyc_module_benchmark(py=True, pyc=True)
+bench_pyc_without_py = py_pyc_module_benchmark(py=False, pyc=True)
+bench_py_without_pyc = py_pyc_module_benchmark(py=True, pyc=False)
+
+
 def main():
+    max_name_len = max(len(name) for name in globals().keys())
+    repetitions = 2
+    iterations = 10000
+    print ("Repeating tests %s times with %s iterations ..." %
+            (repetitions, iterations))
+    print
+    print "%s time per repetition (in ms)" % "benchmark".ljust(max_name_len)
+    print '-' * 50
     for name, item in globals().iteritems():
         if name.startswith('bench_'):
-            timings = item(10000, 1)
-            print "%s: %s" % (item.__name__, timings)
-            
+            timings = item(iterations, repetitions)
+            print "%s %s" % (name.ljust(max_name_len),
+                             [int(result*1000) for result in timings])
+
             
 if __name__ == '__main__':
     main()


More information about the Python-checkins mailing list