]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-107369: Optimise ``textwrap.indent()`` (#131923)
authorAdam Turner <9087854+AA-Turner@users.noreply.github.com>
Mon, 31 Mar 2025 17:31:39 +0000 (18:31 +0100)
committerGitHub <noreply@github.com>
Mon, 31 Mar 2025 17:31:39 +0000 (18:31 +0100)
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
Lib/textwrap.py
Misc/NEWS.d/next/Library/2025-03-31-02-06-57.gh-issue-107369.8M-HVz.rst [new file with mode: 0644]

index bb6a1186316275073e5b0b098fe14eac278a9906..bac98c99e41df8474d2d39be137b8b7d2fc8c081 100644 (file)
@@ -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 (file)
index 0000000..9b1bd9e
--- /dev/null
@@ -0,0 +1,2 @@
+Improved performance of :func:`textwrap.dedent` by an average of ~1.3x.
+Patch by Adam Turner.