diff options
author | Fredrik Lundh <fredrik@pythonware.com> | 2006-05-25 18:44:29 +0000 |
---|---|---|
committer | Fredrik Lundh <fredrik@pythonware.com> | 2006-05-25 18:44:29 +0000 |
commit | c3434b3834a5cf7e7ce14c775c82d0cc70bce424 (patch) | |
tree | 54d9ab5d924b8c78b24851dfe7d234c9cc80f40e | |
parent | cfecd599b6dbcc7939560e6ca0a74b4223b389e2 (diff) | |
download | cpython-git-c3434b3834a5cf7e7ce14c775c82d0cc70bce424.tar.gz |
needforspeed: use fastsearch also for find/index and contains. the
related tests are now about 10x faster.
-rw-r--r-- | Objects/stringobject.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c index e74744d369..33cbf07406 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -1149,10 +1149,14 @@ string_contains(PyObject *a, PyObject *el) { 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 @@ string_contains(PyObject *a, PyObject *el) 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 @@ string_contains(PyObject *a, PyObject *el) return 1; s++; } +#endif return 0; } @@ -1895,6 +1908,17 @@ string_find_internal(PyStringObject *self, PyObject *args, int dir) 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; |