Skip to content

Commit

Permalink
pythongh-120397: Optimize str.count() for single characters (python#1…
Browse files Browse the repository at this point in the history
  • Loading branch information
rhpvorderman authored Jun 13, 2024
1 parent 6ae254a commit 2078eb4
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Improve the througput by up to two times for the :meth:`str.count`, :meth:`bytes.count` and :meth:`bytearray.count`
methods for counting single characters.
19 changes: 19 additions & 0 deletions Objects/stringlib/fastsearch.h
Original file line number Diff line number Diff line change
Expand Up @@ -753,6 +753,22 @@ STRINGLIB(count_char)(const STRINGLIB_CHAR *s, Py_ssize_t n,
}


static inline Py_ssize_t
STRINGLIB(count_char_no_maxcount)(const STRINGLIB_CHAR *s, Py_ssize_t n,
const STRINGLIB_CHAR p0)
/* A specialized function of count_char that does not cut off at a maximum.
As a result, the compiler is able to vectorize the loop. */
{
Py_ssize_t count = 0;
for (Py_ssize_t i = 0; i < n; i++) {
if (s[i] == p0) {
count++;
}
}
return count;
}


Py_LOCAL_INLINE(Py_ssize_t)
FASTSEARCH(const STRINGLIB_CHAR* s, Py_ssize_t n,
const STRINGLIB_CHAR* p, Py_ssize_t m,
Expand All @@ -773,6 +789,9 @@ FASTSEARCH(const STRINGLIB_CHAR* s, Py_ssize_t n,
else if (mode == FAST_RSEARCH)
return STRINGLIB(rfind_char)(s, n, p[0]);
else {
if (maxcount == PY_SSIZE_T_MAX) {
return STRINGLIB(count_char_no_maxcount)(s, n, p[0]);
}
return STRINGLIB(count_char)(s, n, p[0], maxcount);
}
}
Expand Down

0 comments on commit 2078eb4

Please sign in to comment.