]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-117348: restore import time performance of configparser (#117703)
authorJason R. Coombs <jaraco@jaraco.com>
Sun, 14 Apr 2024 11:10:09 +0000 (07:10 -0400)
committerGitHub <noreply@github.com>
Sun, 14 Apr 2024 11:10:09 +0000 (11:10 +0000)
Reduces import time by over 50% (10431µs vs 4350µs on Apple M3 Pro).

Lib/configparser.py
Misc/NEWS.d/next/Library/2024-04-09-20-14-44.gh-issue-117348.A2NAAz.rst [new file with mode: 0644]

index d0326c60e9b9079d479dcaf652781a886b461b25..ff7d712bed4afc57279922a6f25cb11b2ce84e37 100644 (file)
@@ -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 (file)
index 0000000..2451a4e
--- /dev/null
@@ -0,0 +1,2 @@
+Largely restored import time performance of configparser by avoiding
+dataclasses.