From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Mon, 31 Mar 2025 17:31:39 +0000 (+0100) Subject: gh-107369: Optimise ``textwrap.indent()`` (#131923) X-Git-Tag: v3.14.0a7~121 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=51e0f2b06c042b8742145ce094323a34b61f02aa;p=thirdparty%2FPython%2Fcpython.git gh-107369: Optimise ``textwrap.indent()`` (#131923) Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- diff --git a/Lib/textwrap.py b/Lib/textwrap.py index bb6a11863162..bac98c99e41d 100644 --- a/Lib/textwrap.py +++ b/Lib/textwrap.py @@ -451,19 +451,20 @@ def indent(text, prefix, predicate=None): it will default to adding 'prefix' to all non-empty lines that do not consist solely of whitespace characters. """ - if predicate is None: - # str.splitlines(True) doesn't produce empty string. - # ''.splitlines(True) => [] - # 'foo\n'.splitlines(True) => ['foo\n'] - # So we can use just `not s.isspace()` here. - predicate = lambda s: not s.isspace() - prefixed_lines = [] - for line in text.splitlines(True): - if predicate(line): - prefixed_lines.append(prefix) - prefixed_lines.append(line) - + if predicate is None: + # str.splitlines(keepends=True) doesn't produce the empty string, + # so we need to use `str.isspace()` rather than a truth test. + # Inlining the predicate leads to a ~30% performance improvement. + for line in text.splitlines(True): + if not line.isspace(): + prefixed_lines.append(prefix) + prefixed_lines.append(line) + else: + for line in text.splitlines(True): + if predicate(line): + prefixed_lines.append(prefix) + prefixed_lines.append(line) return ''.join(prefixed_lines) diff --git a/Misc/NEWS.d/next/Library/2025-03-31-02-06-57.gh-issue-107369.8M-HVz.rst b/Misc/NEWS.d/next/Library/2025-03-31-02-06-57.gh-issue-107369.8M-HVz.rst new file mode 100644 index 000000000000..9b1bd9e7502b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-03-31-02-06-57.gh-issue-107369.8M-HVz.rst @@ -0,0 +1,2 @@ +Improved performance of :func:`textwrap.dedent` by an average of ~1.3x. +Patch by Adam Turner.