diff options
| author | Anthony Sottile <asottile@umich.edu> | 2019-01-31 09:18:17 -0800 |
|---|---|---|
| committer | Anthony Sottile <asottile@umich.edu> | 2019-01-31 09:23:02 -0800 |
| commit | c85b282b05745a1b2a7392bbfa0e5489bf6c3ff7 (patch) | |
| tree | 8acbc36ac19ad2485c09f44a1f2de9bbfa51792d | |
| parent | ee7081c8cea838fe57110f23899234e373988bec (diff) | |
| download | flake8-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.cfg | 1 | ||||
| -rw-r--r-- | setup.py | 2 | ||||
| -rw-r--r-- | src/flake8/style_guide.py | 14 |
3 files changed, 8 insertions, 9 deletions
@@ -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 @@ -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( |
