mirror of
https://github.com/python/cpython.git
synced 2025-08-28 04:35:02 +00:00
* Simplify and speedup logic for tp_print.
* Speed-up intersection whenever PyDict_Next can be used.
This commit is contained in:
parent
a180581511
commit
a3b11e7fb3
1 changed files with 29 additions and 15 deletions
|
@ -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)
|
||||||
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
|
||||||
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 = {
|
||||||
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 */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue