[Python-checkins] cpython: Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
victor.stinner
python-checkins at python.org
Mon Nov 4 11:24:53 CET 2013
http://hg.python.org/cpython/rev/5fa291435740
changeset: 86918:5fa291435740
user: Victor Stinner <victor.stinner at gmail.com>
date: Mon Nov 04 11:23:05 2013 +0100
summary:
Issue #16286: optimize PyUnicode_RichCompare() for identical strings (same
pointer) for any operator, not only Py_EQ and Py_NE.
Code of bytes_richcompare() and PyUnicode_RichCompare() is now closer.
files:
Objects/bytesobject.c | 23 ++++++++++++++++-------
Objects/unicodeobject.c | 24 +++++++++++++++++++-----
2 files changed, 35 insertions(+), 12 deletions(-)
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -842,12 +842,20 @@
}
else if (a == b) {
switch (op) {
- case Py_EQ:case Py_LE:case Py_GE:
+ case Py_EQ:
+ case Py_LE:
+ case Py_GE:
+ /* a string is equal to itself */
result = Py_True;
break;
- case Py_NE:case Py_LT:case Py_GT:
+ case Py_NE:
+ case Py_LT:
+ case Py_GT:
result = Py_False;
break;
+ default:
+ PyErr_BadArgument();
+ return NULL;
}
}
else if (op == Py_EQ || op == Py_NE) {
@@ -856,11 +864,12 @@
result = eq ? Py_True : Py_False;
}
else {
- len_a = Py_SIZE(a); len_b = Py_SIZE(b);
- min_len = (len_a < len_b) ? len_a : len_b;
+ len_a = Py_SIZE(a);
+ len_b = Py_SIZE(b);
+ min_len = Py_MIN(len_a, len_b);
if (min_len > 0) {
c = Py_CHARMASK(*a->ob_sval) - Py_CHARMASK(*b->ob_sval);
- if (c==0)
+ if (c == 0)
c = memcmp(a->ob_sval, b->ob_sval, min_len);
}
else
@@ -873,8 +882,8 @@
case Py_GT: c = c > 0; break;
case Py_GE: c = c >= 0; break;
default:
- assert(op != Py_EQ && op != Py_NE);
- Py_RETURN_NOTIMPLEMENTED;
+ PyErr_BadArgument();
+ return NULL;
}
result = c ? Py_True : Py_False;
}
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -10534,10 +10534,6 @@
Py_ssize_t len;
int cmp;
- /* a string is equal to itself */
- if (str1 == str2)
- return 1;
-
len = PyUnicode_GET_LENGTH(str1);
if (PyUnicode_GET_LENGTH(str2) != len)
return 0;
@@ -10628,7 +10624,25 @@
PyUnicode_READY(right) == -1)
return NULL;
- if (op == Py_EQ || op == Py_NE) {
+ if (left == right) {
+ switch (op) {
+ case Py_EQ:
+ case Py_LE:
+ case Py_GE:
+ /* a string is equal to itself */
+ v = Py_True;
+ break;
+ case Py_NE:
+ case Py_LT:
+ case Py_GT:
+ v = Py_False;
+ break;
+ default:
+ PyErr_BadArgument();
+ return NULL;
+ }
+ }
+ else if (op == Py_EQ || op == Py_NE) {
result = unicode_compare_eq(left, right);
result ^= (op == Py_NE);
v = TEST_COND(result);
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list