Kaydet (Commit) a3b11e7f authored tarafından Raymond Hettinger's avatar Raymond Hettinger

* Simplify and speedup logic for tp_print.

* Speed-up intersection whenever PyDict_Next can be used.
üst a1805815
...@@ -240,7 +240,7 @@ static PyObject * ...@@ -240,7 +240,7 @@ static PyObject *
set_intersection(PySetObject *so, PyObject *other) set_intersection(PySetObject *so, PyObject *other)
{ {
PySetObject *result; PySetObject *result;
PyObject *item, *selfdata, *tgtdata, *it; PyObject *item, *selfdata, *tgtdata, *it, *tmp;
result = (PySetObject *)make_new_set(so->ob_type, NULL); result = (PySetObject *)make_new_set(so->ob_type, NULL);
if (result == NULL) if (result == NULL)
...@@ -248,14 +248,27 @@ set_intersection(PySetObject *so, PyObject *other) ...@@ -248,14 +248,27 @@ set_intersection(PySetObject *so, PyObject *other)
tgtdata = result->data; tgtdata = result->data;
selfdata = so->data; selfdata = so->data;
if (PyAnySet_Check(other) && if (PyAnySet_Check(other))
PyDict_Size(((PySetObject *)other)->data) > PyDict_Size(selfdata)) { other = ((PySetObject *)other)->data;
selfdata = ((PySetObject *)other)->data;
other = (PyObject *)so; if (PyDict_Check(other) && PyDict_Size(other) > PyDict_Size(selfdata)) {
} else if (PyDict_Check(other) && tmp = selfdata;
PyDict_Size(other) > PyDict_Size(selfdata)) {
selfdata = other; selfdata = other;
other = so->data; other = tmp;
}
if (PyDict_CheckExact(other)) {
PyObject *value;
int pos = 0;
while (PyDict_Next(other, &pos, &item, &value)) {
if (PyDict_Contains(selfdata, item)) {
if (PyDict_SetItem(tgtdata, item, Py_True) == -1) {
Py_DECREF(result);
return NULL;
}
}
}
return (PyObject *)result;
} }
it = PyObject_GetIter(other); it = PyObject_GetIter(other);
...@@ -719,18 +732,18 @@ static int ...@@ -719,18 +732,18 @@ static int
set_tp_print(PySetObject *so, FILE *fp, int flags) set_tp_print(PySetObject *so, FILE *fp, int flags)
{ {
PyObject *key, *value; PyObject *key, *value;
int pos=0, firstpass=1; int pos=0;
char *emit = ""; /* No separator emitted on first pass */
char *separator = ", ";
fprintf(fp, "%s([", so->ob_type->tp_name); fprintf(fp, "%s([", so->ob_type->tp_name);
while (PyDict_Next(so->data, &pos, &key, &value)) { while (PyDict_Next(so->data, &pos, &key, &value)) {
if (firstpass) fputs(emit, fp);
firstpass = 0; emit = separator;
else
fprintf(fp, ", ");
if (PyObject_Print(key, fp, 0) != 0) if (PyObject_Print(key, fp, 0) != 0)
return -1; return -1;
} }
fprintf(fp, "])"); fputs("])", fp);
return 0; return 0;
} }
...@@ -1077,7 +1090,8 @@ PyTypeObject PyFrozenSet_Type = { ...@@ -1077,7 +1090,8 @@ PyTypeObject PyFrozenSet_Type = {
0, /* ob_size */ 0, /* ob_size */
"frozenset", /* tp_name */ "frozenset", /* tp_name */
sizeof(PySetObject), /* tp_basicsize */ sizeof(PySetObject), /* tp_basicsize */
0, /* tp_itemsize */ /* methods */ 0, /* tp_itemsize */
/* methods */
(destructor)set_dealloc, /* tp_dealloc */ (destructor)set_dealloc, /* tp_dealloc */
(printfunc)set_tp_print, /* tp_print */ (printfunc)set_tp_print, /* tp_print */
0, /* tp_getattr */ 0, /* tp_getattr */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment