From 06d8b5eb6fc2e96a32b94ece2610b36db02d2b4b Mon Sep 17 00:00:00 2001 From: nineteendo Date: Fri, 26 Apr 2024 01:34:05 +0200 Subject: [PATCH 1/4] Re-use old indent in `json.loads()` --- Lib/json/encoder.py | 47 +++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/Lib/json/encoder.py b/Lib/json/encoder.py index 597849eca0524a..283578c9ec3e05 100644 --- a/Lib/json/encoder.py +++ b/Lib/json/encoder.py @@ -250,12 +250,13 @@ def floatstr(o, allow_nan=self.allow_nan, markers, self.default, _encoder, self.indent, self.key_separator, self.item_separator, self.sort_keys, self.skipkeys, self.allow_nan) + return _iterencode(o, 0) else: _iterencode = _make_iterencode( markers, self.default, _encoder, self.indent, floatstr, self.key_separator, self.item_separator, self.sort_keys, self.skipkeys, _one_shot) - return _iterencode(o, 0) + return _iterencode(o, '' if self.indent is None else '\n') def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, _key_separator, _item_separator, _sort_keys, _skipkeys, _one_shot, @@ -275,7 +276,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, if _indent is not None and not isinstance(_indent, str): _indent = ' ' * _indent - def _iterencode_list(lst, _current_indent_level): + def _iterencode_list(lst, old_newline_indent): if not lst: yield '[]' return @@ -286,12 +287,11 @@ def _iterencode_list(lst, _current_indent_level): markers[markerid] = lst buf = '[' if _indent is not None: - _current_indent_level += 1 - newline_indent = '\n' + _indent * _current_indent_level + newline_indent = old_newline_indent + _indent separator = _item_separator + newline_indent buf += newline_indent else: - newline_indent = None + newline_indent = '' separator = _item_separator first = True for value in lst: @@ -318,20 +318,19 @@ def _iterencode_list(lst, _current_indent_level): else: yield buf if isinstance(value, (list, tuple)): - chunks = _iterencode_list(value, _current_indent_level) + chunks = _iterencode_list(value, newline_indent) elif isinstance(value, dict): - chunks = _iterencode_dict(value, _current_indent_level) + chunks = _iterencode_dict(value, newline_indent) else: - chunks = _iterencode(value, _current_indent_level) + chunks = _iterencode(value, newline_indent) yield from chunks - if newline_indent is not None: - _current_indent_level -= 1 - yield '\n' + _indent * _current_indent_level + if _indent is not None: + yield old_newline_indent yield ']' if markers is not None: del markers[markerid] - def _iterencode_dict(dct, _current_indent_level): + def _iterencode_dict(dct, old_newline_indent): if not dct: yield '{}' return @@ -342,12 +341,11 @@ def _iterencode_dict(dct, _current_indent_level): markers[markerid] = dct yield '{' if _indent is not None: - _current_indent_level += 1 - newline_indent = '\n' + _indent * _current_indent_level + newline_indent = old_newline_indent + _indent item_separator = _item_separator + newline_indent yield newline_indent else: - newline_indent = None + newline_indent = '' item_separator = _item_separator first = True if _sort_keys: @@ -398,20 +396,19 @@ def _iterencode_dict(dct, _current_indent_level): yield _floatstr(value) else: if isinstance(value, (list, tuple)): - chunks = _iterencode_list(value, _current_indent_level) + chunks = _iterencode_list(value, newline_indent) elif isinstance(value, dict): - chunks = _iterencode_dict(value, _current_indent_level) + chunks = _iterencode_dict(value, newline_indent) else: - chunks = _iterencode(value, _current_indent_level) + chunks = _iterencode(value, newline_indent) yield from chunks - if newline_indent is not None: - _current_indent_level -= 1 - yield '\n' + _indent * _current_indent_level + if _indent is not None: + yield old_newline_indent yield '}' if markers is not None: del markers[markerid] - def _iterencode(o, _current_indent_level): + def _iterencode(o, newline_indent): if isinstance(o, str): yield _encoder(o) elif o is None: @@ -427,9 +424,9 @@ def _iterencode(o, _current_indent_level): # see comment for int/float in _make_iterencode yield _floatstr(o) elif isinstance(o, (list, tuple)): - yield from _iterencode_list(o, _current_indent_level) + yield from _iterencode_list(o, newline_indent) elif isinstance(o, dict): - yield from _iterencode_dict(o, _current_indent_level) + yield from _iterencode_dict(o, newline_indent) else: if markers is not None: markerid = id(o) @@ -437,7 +434,7 @@ def _iterencode(o, _current_indent_level): raise ValueError("Circular reference detected") markers[markerid] = o o = _default(o) - yield from _iterencode(o, _current_indent_level) + yield from _iterencode(o, newline_indent) if markers is not None: del markers[markerid] return _iterencode From 17d0fd3efa9c54786d5fe40d1fb24eb2c4eafe34 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 23:44:13 +0000 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20blu?= =?UTF-8?q?rb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2024-04-25-23-44-12.gh-issue-118299.XwAjhh.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2024-04-25-23-44-12.gh-issue-118299.XwAjhh.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2024-04-25-23-44-12.gh-issue-118299.XwAjhh.rst b/Misc/NEWS.d/next/Core and Builtins/2024-04-25-23-44-12.gh-issue-118299.XwAjhh.rst new file mode 100644 index 00000000000000..c6e7555bd57b11 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2024-04-25-23-44-12.gh-issue-118299.XwAjhh.rst @@ -0,0 +1 @@ +Speedup :func:`json.dumps`. From 1c5245d22d65684d1d8c6e1e4f54f9a2d9aa6ede Mon Sep 17 00:00:00 2001 From: Nice Zombies Date: Sun, 28 Apr 2024 18:17:49 +0200 Subject: [PATCH 3/4] Delete Misc/NEWS.d/next/Core and Builtins/2024-04-25-23-44-12.gh-issue-118299.XwAjhh.rst --- .../2024-04-25-23-44-12.gh-issue-118299.XwAjhh.rst | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Misc/NEWS.d/next/Core and Builtins/2024-04-25-23-44-12.gh-issue-118299.XwAjhh.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2024-04-25-23-44-12.gh-issue-118299.XwAjhh.rst b/Misc/NEWS.d/next/Core and Builtins/2024-04-25-23-44-12.gh-issue-118299.XwAjhh.rst deleted file mode 100644 index c6e7555bd57b11..00000000000000 --- a/Misc/NEWS.d/next/Core and Builtins/2024-04-25-23-44-12.gh-issue-118299.XwAjhh.rst +++ /dev/null @@ -1 +0,0 @@ -Speedup :func:`json.dumps`. From 4f353c3808b011918a786301e5b2cdbfa7c1b64c Mon Sep 17 00:00:00 2001 From: Nineteendo Date: Mon, 6 May 2024 16:27:13 +0200 Subject: [PATCH 4/4] Use correct indent --- Lib/json/encoder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/json/encoder.py b/Lib/json/encoder.py index 4d1d30ca224465..cd81792c01a2e9 100644 --- a/Lib/json/encoder.py +++ b/Lib/json/encoder.py @@ -259,7 +259,7 @@ def floatstr(o, allow_nan=self.allow_nan, markers, self.default, _encoder, indent, floatstr, self.key_separator, self.item_separator, self.sort_keys, self.skipkeys, _one_shot) - return _iterencode(o, '' if self.indent is None else '\n') + return _iterencode(o, '' if indent is None else '\n') def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, _key_separator, _item_separator, _sort_keys, _skipkeys, _one_shot,