[Python-checkins] cpython: Make platform.libc_ver() less slow

antoine.pitrou python-checkins at python.org
Fri Oct 7 13:31:35 CEST 2011


http://hg.python.org/cpython/rev/e55219affc7d
changeset:   72787:e55219affc7d
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Fri Oct 07 13:26:59 2011 +0200
summary:
  Make platform.libc_ver() less slow

files:
  Lib/platform.py |  25 +++++++++++++++----------
  1 files changed, 15 insertions(+), 10 deletions(-)


diff --git a/Lib/platform.py b/Lib/platform.py
--- a/Lib/platform.py
+++ b/Lib/platform.py
@@ -130,15 +130,15 @@
 
 ### Platform specific APIs
 
-_libc_search = re.compile(r'(__libc_init)'
-                          '|'
-                          '(GLIBC_([0-9.]+))'
-                          '|'
-                          '(libc(_\w+)?\.so(?:\.(\d[0-9.]*))?)', re.ASCII)
+_libc_search = re.compile(b'(__libc_init)'
+                          b'|'
+                          b'(GLIBC_([0-9.]+))'
+                          b'|'
+                          br'(libc(_\w+)?\.so(?:\.(\d[0-9.]*))?)', re.ASCII)
 
 def libc_ver(executable=sys.executable,lib='',version='',
 
-             chunksize=2048):
+             chunksize=16384):
 
     """ Tries to determine the libc version that the file executable
         (which defaults to the Python interpreter) is linked against.
@@ -159,17 +159,22 @@
         # able to open symlinks for reading
         executable = os.path.realpath(executable)
     f = open(executable,'rb')
-    binary = f.read(chunksize).decode('latin-1')
+    binary = f.read(chunksize)
     pos = 0
     while 1:
-        m = _libc_search.search(binary,pos)
+        if b'libc' in binary or b'GLIBC' in binary:
+            m = _libc_search.search(binary,pos)
+        else:
+            m = None
         if not m:
-            binary = f.read(chunksize).decode('latin-1')
+            binary = f.read(chunksize)
             if not binary:
                 break
             pos = 0
             continue
-        libcinit,glibc,glibcversion,so,threads,soversion = m.groups()
+        libcinit,glibc,glibcversion,so,threads,soversion = [
+            s.decode('latin1') if s is not None else s
+            for s in m.groups()]
         if libcinit and not lib:
             lib = 'libc'
         elif glibc:

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list