gh-150942: Speed up re.findall and re.sub/subn result building (gh-150943)

This commit is contained in:
Pieter Eendebak 2026-06-07 14:06:36 +02:00 committed by GitHub
parent 253904f752
commit 0f7dc2fefa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 8 additions and 8 deletions

View file

@ -0,0 +1,3 @@
Speed up :func:`re.findall`, :func:`re.sub` and :func:`re.subn` by appending
result items to the output list without an extra reference-count round-trip
(using the internal reference-stealing list append helper).

View file

@ -42,6 +42,7 @@ static const char copyright[] =
#include "pycore_critical_section.h" // Py_BEGIN_CRITICAL_SECTION
#include "pycore_dict.h" // _PyDict_Next()
#include "pycore_long.h" // _PyLong_GetZero()
#include "pycore_list.h" // _PyList_AppendTakeRef()
#include "pycore_moduleobject.h" // _PyModule_GetState()
#include "pycore_tuple.h" // _PyTuple_FromPairSteal
#include "pycore_unicodeobject.h" // _PyUnicode_Copy
@ -986,8 +987,7 @@ _sre_SRE_Pattern_findall_impl(PatternObject *self, PyObject *string,
break;
}
status = PyList_Append(list, item);
Py_DECREF(item);
status = _PyList_AppendTakeRef((PyListObject *)list, item);
if (status < 0)
goto error;
@ -1333,8 +1333,7 @@ pattern_subx(_sremodulestate* module_state,
string, i, b);
if (!item)
goto error;
status = PyList_Append(list, item);
Py_DECREF(item);
status = _PyList_AppendTakeRef((PyListObject *)list, item);
if (status < 0)
goto error;
@ -1363,8 +1362,7 @@ pattern_subx(_sremodulestate* module_state,
/* add to list */
if (item != Py_None) {
status = PyList_Append(list, item);
Py_DECREF(item);
status = _PyList_AppendTakeRef((PyListObject *)list, item);
if (status < 0)
goto error;
}
@ -1381,8 +1379,7 @@ pattern_subx(_sremodulestate* module_state,
string, i, state.endpos);
if (!item)
goto error;
status = PyList_Append(list, item);
Py_DECREF(item);
status = _PyList_AppendTakeRef((PyListObject *)list, item);
if (status < 0)
goto error;
}