diff --git a/Misc/NEWS.d/next/Core and Builtins/2024-04-01-21-15-35.gh-issue-117431.UBT4zj.rst b/Misc/NEWS.d/next/Core and Builtins/2024-04-01-21-15-35.gh-issue-117431.UBT4zj.rst new file mode 100644 index 00000000000000..3c862000164f6a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2024-04-01-21-15-35.gh-issue-117431.UBT4zj.rst @@ -0,0 +1 @@ +Improve performance of startswith, endswith, count and find methods for strings and bytes. diff --git a/Objects/stringlib/find.h b/Objects/stringlib/find.h index 509b9297396be8..60d13ab54415eb 100644 --- a/Objects/stringlib/find.h +++ b/Objects/stringlib/find.h @@ -91,6 +91,15 @@ STRINGLIB(parse_args_finds)(const char * function_name, PyObject *args, Py_ssize_t tmp_start = 0; Py_ssize_t tmp_end = PY_SSIZE_T_MAX; PyObject *obj_start=Py_None, *obj_end=Py_None; + + if (PyTuple_GET_SIZE(args) == 1) { + // fast path + *start = tmp_start; + *end = tmp_end; + *subobj = PyTuple_GET_ITEM(args, 0); + return 1; + } + char format[FORMAT_BUFFER_SIZE] = "O|OO:"; size_t len = strlen(format);