needforspeed: use fastsearch also for find/index and contains. the
related tests are now about 10x faster.
This commit is contained in:
parent
cfecd599b6
commit
c3434b3834
|
@ -1149,10 +1149,14 @@ string_contains(PyObject *a, PyObject *el)
|
||||||
{
|
{
|
||||||
char *s = PyString_AS_STRING(a);
|
char *s = PyString_AS_STRING(a);
|
||||||
const char *sub = PyString_AS_STRING(el);
|
const char *sub = PyString_AS_STRING(el);
|
||||||
char *last;
|
|
||||||
Py_ssize_t len_sub = PyString_GET_SIZE(el);
|
Py_ssize_t len_sub = PyString_GET_SIZE(el);
|
||||||
|
#ifdef USE_FAST
|
||||||
|
Py_ssize_t pos;
|
||||||
|
#else
|
||||||
|
char *last;
|
||||||
Py_ssize_t shortsub;
|
Py_ssize_t shortsub;
|
||||||
char firstchar, lastchar;
|
char firstchar, lastchar;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!PyString_CheckExact(el)) {
|
if (!PyString_CheckExact(el)) {
|
||||||
#ifdef Py_USING_UNICODE
|
#ifdef Py_USING_UNICODE
|
||||||
|
@ -1168,6 +1172,14 @@ string_contains(PyObject *a, PyObject *el)
|
||||||
|
|
||||||
if (len_sub == 0)
|
if (len_sub == 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
#ifdef USE_FAST
|
||||||
|
pos = fastsearch(
|
||||||
|
s, PyString_GET_SIZE(a),
|
||||||
|
sub, len_sub, FAST_SEARCH
|
||||||
|
);
|
||||||
|
return (pos != -1);
|
||||||
|
#else
|
||||||
/* last points to one char beyond the start of the rightmost
|
/* last points to one char beyond the start of the rightmost
|
||||||
substring. When s<last, there is still room for a possible match
|
substring. When s<last, there is still room for a possible match
|
||||||
and s[0] through s[len_sub-1] will be in bounds.
|
and s[0] through s[len_sub-1] will be in bounds.
|
||||||
|
@ -1188,6 +1200,7 @@ string_contains(PyObject *a, PyObject *el)
|
||||||
return 1;
|
return 1;
|
||||||
s++;
|
s++;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1895,6 +1908,17 @@ string_find_internal(PyStringObject *self, PyObject *args, int dir)
|
||||||
|
|
||||||
string_adjust_indices(&i, &last, len);
|
string_adjust_indices(&i, &last, len);
|
||||||
|
|
||||||
|
#ifdef USE_FAST
|
||||||
|
if (n == 0)
|
||||||
|
return (dir > 0) ? i : last;
|
||||||
|
if (dir > 0) {
|
||||||
|
Py_ssize_t pos = fastsearch(s + i, last - i, sub, n,
|
||||||
|
FAST_SEARCH);
|
||||||
|
if (pos < 0)
|
||||||
|
return pos;
|
||||||
|
return pos + i;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (dir > 0) {
|
if (dir > 0) {
|
||||||
if (n == 0 && i <= last)
|
if (n == 0 && i <= last)
|
||||||
return (long)i;
|
return (long)i;
|
||||||
|
|
Loading…
Reference in New Issue