Patch #409973: Speedup glob.glob, add fnmatch.filter.
diff --git a/Lib/fnmatch.py b/Lib/fnmatch.py
index 182a9ef..da0bb34 100644
--- a/Lib/fnmatch.py
+++ b/Lib/fnmatch.py
@@ -37,6 +37,26 @@
     pat = os.path.normcase(pat)
     return fnmatchcase(name, pat)
 
+def filter(names, pat):
+    """Return the subset of the list NAMES that match PAT"""
+    import os,posixpath
+    result=[]
+    pat=os.path.normcase(pat)
+    if not _cache.has_key(pat):
+        res = translate(pat)
+        _cache[pat] = re.compile(res)
+    match=_cache[pat].match
+    if os.path is posixpath:
+        # normcase on posix is NOP. Optimize it away from the loop.
+        for name in names:
+            if match(name):
+                result.append(name)
+    else:
+        for name in names:
+            if match(os.path.normcase(name)):
+                result.append(name)
+    return result
+
 def fnmatchcase(name, pat):
     """Test whether FILENAME matches PATTERN, including case.
 
diff --git a/Lib/glob.py b/Lib/glob.py
index eeb6bdd..d5e508a 100644
--- a/Lib/glob.py
+++ b/Lib/glob.py
@@ -18,7 +18,9 @@
         else:
             return []
     dirname, basename = os.path.split(pathname)
-    if has_magic(dirname):
+    if not dirname:
+        return glob1(os.curdir, basename)
+    elif has_magic(dirname):
         list = glob(dirname)
     else:
         list = [dirname]
@@ -43,12 +45,9 @@
         names = os.listdir(dirname)
     except os.error:
         return []
-    result = []
-    for name in names:
-        if name[0] != '.' or pattern[0] == '.':
-            if fnmatch.fnmatch(name, pattern):
-                result.append(name)
-    return result
+    if pattern[0]!='.':
+        names=filter(lambda x: x[0]!='.',names)
+    return fnmatch.filter(names,pattern)
 
 
 magic_check = re.compile('[*?[]')