diff options
author | Jason R. Coombs <jaraco@jaraco.com> | 2024-04-14 11:10:09 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-14 11:10:09 (GMT) |
commit | 9c93b7402ba11d1d68e856516e56ca72989a7db9 (patch) | |
tree | bbefb8cac1c4f4bc4da63dc526180549ebaab4f3 | |
parent | c99d374fc7327ebd47e22c3b1906bc865aad80a1 (diff) | |
download | cpython-9c93b7402ba11d1d68e856516e56ca72989a7db9.zip cpython-9c93b7402ba11d1d68e856516e56ca72989a7db9.tar.gz cpython-9c93b7402ba11d1d68e856516e56ca72989a7db9.tar.bz2 |
gh-117348: restore import time performance of configparser (#117703)
Reduces import time by over 50% (10431µs vs 4350µs on Apple M3 Pro).
-rw-r--r-- | Lib/configparser.py | 24 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2024-04-09-20-14-44.gh-issue-117348.A2NAAz.rst | 2 |
2 files changed, 13 insertions, 13 deletions
diff --git a/Lib/configparser.py b/Lib/configparser.py index d0326c6..ff7d712 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -143,17 +143,18 @@ ConfigParser -- responsible for parsing a list of between keys and values are surrounded by spaces. """ -from collections.abc import MutableMapping +# Do not import dataclasses; overhead is unacceptable (gh-117703) + +from collections.abc import Iterable, MutableMapping from collections import ChainMap as _ChainMap import contextlib -from dataclasses import dataclass, field import functools import io import itertools import os import re import sys -from typing import Iterable +import types __all__ = ("NoSectionError", "DuplicateOptionError", "DuplicateSectionError", "NoOptionError", "InterpolationError", "InterpolationDepthError", @@ -538,21 +539,18 @@ class ExtendedInterpolation(Interpolation): "found: %r" % (rest,)) -@dataclass class _ReadState: - elements_added : set[str] = field(default_factory=set) + elements_added : set[str] cursect : dict[str, str] | None = None sectname : str | None = None optname : str | None = None lineno : int = 0 indent_level : int = 0 - errors : list[ParsingError] = field(default_factory=list) - + errors : list[ParsingError] -@dataclass -class _Prefixes: - full : Iterable[str] - inline : Iterable[str] + def __init__(self): + self.elements_added = set() + self.errors = list() class _Line(str): @@ -560,7 +558,7 @@ class _Line(str): def __new__(cls, val, *args, **kwargs): return super().__new__(cls, val) - def __init__(self, val, prefixes: _Prefixes): + def __init__(self, val, prefixes): self.prefixes = prefixes @functools.cached_property @@ -653,7 +651,7 @@ class RawConfigParser(MutableMapping): else: self._optcre = re.compile(self._OPT_TMPL.format(delim=d), re.VERBOSE) - self._prefixes = _Prefixes( + self._prefixes = types.SimpleNamespace( full=tuple(comment_prefixes or ()), inline=tuple(inline_comment_prefixes or ()), ) diff --git a/Misc/NEWS.d/next/Library/2024-04-09-20-14-44.gh-issue-117348.A2NAAz.rst b/Misc/NEWS.d/next/Library/2024-04-09-20-14-44.gh-issue-117348.A2NAAz.rst new file mode 100644 index 0000000..2451a4e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-04-09-20-14-44.gh-issue-117348.A2NAAz.rst @@ -0,0 +1,2 @@ +Largely restored import time performance of configparser by avoiding +dataclasses. |