[Python-checkins] r46239 - python/trunk/Objects/stringobject.c

fredrik.lundh python-checkins at python.org
Thu May 25 20:44:29 CEST 2006


Author: fredrik.lundh
Date: Thu May 25 20:44:29 2006
New Revision: 46239

Modified:
   python/trunk/Objects/stringobject.c
Log:
needforspeed: use fastsearch also for find/index and contains.  the
related tests are now about 10x faster.



Modified: python/trunk/Objects/stringobject.c
==============================================================================
--- python/trunk/Objects/stringobject.c	(original)
+++ python/trunk/Objects/stringobject.c	Thu May 25 20:44:29 2006
@@ -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;


More information about the Python-checkins mailing list