]> granicus.if.org Git - python/commitdiff
bpo-31671: re: Convert RegexFlag to int before compile (GH-3862)
authorINADA Naoki <methane@users.noreply.github.com>
Thu, 5 Oct 2017 08:19:26 +0000 (17:19 +0900)
committerGitHub <noreply@github.com>
Thu, 5 Oct 2017 08:19:26 +0000 (17:19 +0900)
sre_compile does bit test (e.g. `flags & SRE_FLAG_IGNORECASE`) in loop.
`IntFlag.__and__` and `IntFlag.__new__` made it slower.

So this commit convert it to normal int before passing flags to `sre_compile()`.

Doc/whatsnew/3.7.rst
Lib/re.py
Misc/NEWS.d/next/Library/2017-10-04-21-28-44.bpo-31671.E-zfc9.rst [new file with mode: 0644]

index 845ed643f97b5bf4ab2cdbf4d0aaf36879d5c174..19b766fd2ff2615f0cbcdd4c4da282b3cd4ccec7 100644 (file)
@@ -326,6 +326,11 @@ Optimizations
   expressions <re>`.  Searching some patterns can now be up to 20 times faster.
   (Contributed by Serhiy Storchaka in :issue:`30285`.)
 
+* :func:`re.compile` now converts ``flags`` parameter to int object if
+  it is ``RegexFlag``.  It is now as fast as Python 3.5, and faster than
+  Python 3.6 about 10% depending on the pattern.
+  (Contributed by INADA Naoki in :issue:`31671`.)
+
 * :meth:`selectors.EpollSelector.modify`, :meth:`selectors.PollSelector.modify`
   and :meth:`selectors.DevpollSelector.modify` may be around 10% faster under
   heavy loads. (Contributed by Giampaolo Rodola' in :issue:`30014`)
index d772979f91e1af4f9a636c75f56a789b473376bb..abbf8d6e290e542fb5bf185fba408303652b249a 100644 (file)
--- a/Lib/re.py
+++ b/Lib/re.py
@@ -275,6 +275,8 @@ _cache = OrderedDict()
 _MAXCACHE = 512
 def _compile(pattern, flags):
     # internal: compile pattern
+    if isinstance(flags, RegexFlag):
+        flags = flags.value
     try:
         return _cache[type(pattern), pattern, flags]
     except KeyError:
@@ -331,6 +333,8 @@ copyreg.pickle(Pattern, _pickle, _compile)
 class Scanner:
     def __init__(self, lexicon, flags=0):
         from sre_constants import BRANCH, SUBPATTERN
+        if isinstance(flags, RegexFlag):
+            flags = flags.value
         self.lexicon = lexicon
         # combine phrases into a compound pattern
         p = []
diff --git a/Misc/NEWS.d/next/Library/2017-10-04-21-28-44.bpo-31671.E-zfc9.rst b/Misc/NEWS.d/next/Library/2017-10-04-21-28-44.bpo-31671.E-zfc9.rst
new file mode 100644 (file)
index 0000000..b84dedd
--- /dev/null
@@ -0,0 +1,2 @@
+Now ``re.compile()`` converts passed RegexFlag to normal int object before
+compiling. bm_regex_compile benchmark shows 14% performance improvements.