summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Sottile <asottile@umich.edu>2019-01-31 09:18:17 -0800
committerAnthony Sottile <asottile@umich.edu>2019-01-31 09:23:02 -0800
commitc85b282b05745a1b2a7392bbfa0e5489bf6c3ff7 (patch)
tree8acbc36ac19ad2485c09f44a1f2de9bbfa51792d
parentee7081c8cea838fe57110f23899234e373988bec (diff)
downloadflake8-c85b282b05745a1b2a7392bbfa0e5489bf6c3ff7.tar.gz
Fix performance regression with per-file-ignores
With a large number of errors, filenames, and per-file-ignores the style guide selection would take a significant portion of execution time (python3 70% / python2 99.9%). Caching the styleguide lookup by filename eliminates this bottleneck.
-rw-r--r--setup.cfg1
-rw-r--r--setup.py2
-rw-r--r--src/flake8/style_guide.py14
3 files changed, 8 insertions, 9 deletions
diff --git a/setup.cfg b/setup.cfg
index 4bc37ad..e887ea8 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -11,6 +11,7 @@ requires-dist =
enum34; python_version<"3.4"
typing; python_version<"3.5"
configparser; python_version<"3.2"
+ functools32; python_version<"3.2"
entrypoints >= 0.3.0, < 0.4.0
pyflakes >= 2.1.0, < 2.2.0
pycodestyle >= 2.5.0, < 2.6.0
diff --git a/setup.py b/setup.py
index f723716..088de25 100644
--- a/setup.py
+++ b/setup.py
@@ -28,7 +28,7 @@ requires = [
extras_require = {
":python_version<'3.4'": ['enum34'],
":python_version<'3.5'": ['typing'],
- ":python_version<'3.2'": ['configparser'],
+ ":python_version<'3.2'": ['configparser', 'functools32'],
}
if int(setuptools.__version__.split('.')[0]) < 18:
diff --git a/src/flake8/style_guide.py b/src/flake8/style_guide.py
index 21a1185..cf723df 100644
--- a/src/flake8/style_guide.py
+++ b/src/flake8/style_guide.py
@@ -3,10 +3,10 @@ import collections
import contextlib
import copy
import enum
-import functools
import itertools
import linecache
import logging
+import sys
from typing import Optional, Union # noqa: F401 (until flake8 3.7)
from flake8 import defaults
@@ -18,13 +18,10 @@ __all__ = ("StyleGuide",)
LOG = logging.getLogger(__name__)
-try:
- lru_cache = functools.lru_cache
-except AttributeError:
-
- def lru_cache(maxsize=128, typed=False):
- """Stub for missing lru_cache."""
- return lambda func: func
+if sys.version_info < (3, 2):
+ from functools32 import lru_cache
+else:
+ from functools import lru_cache
# TODO(sigmavirus24): Determine if we need to use enum/enum34
@@ -366,6 +363,7 @@ class StyleGuideManager(object):
filename=filename, extend_ignore_with=violations
)
+ @lru_cache(maxsize=None)
def style_guide_for(self, filename):
"""Find the StyleGuide for the filename in particular."""
guides = sorted(