needforspeed: use fastsearch also for find/index and contains. the
related tests are now about 10x faster.
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index e74744d..33cbf07 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -1149,10 +1149,14 @@
{
char *s = PyString_AS_STRING(a);
const char *sub = PyString_AS_STRING(el);
- char *last;
Py_ssize_t len_sub = PyString_GET_SIZE(el);
+#ifdef USE_FAST
+ Py_ssize_t pos;
+#else
+ char *last;
Py_ssize_t shortsub;
char firstchar, lastchar;
+#endif
if (!PyString_CheckExact(el)) {
#ifdef Py_USING_UNICODE
@@ -1168,6 +1172,14 @@
if (len_sub == 0)
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
substring. When s<last, there is still room for a possible match
and s[0] through s[len_sub-1] will be in bounds.
@@ -1188,6 +1200,7 @@
return 1;
s++;
}
+#endif
return 0;
}
@@ -1895,6 +1908,17 @@
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 (n == 0 && i <= last)
return (long)i;