Skip to content

Commit a69a4a9

Browse files
bpo-46721: Optimize set.issuperset() for non-set arguments (GH-31280)
1 parent 31cd25f commit a69a4a9

2 files changed

Lines changed: 24 additions & 16 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Optimize :meth:`set.issuperset` for non-set argument.

Objects/setobject.c

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,14 +1382,7 @@ set_isdisjoint(PySetObject *so, PyObject *other)
13821382
return NULL;
13831383

13841384
while ((key = PyIter_Next(it)) != NULL) {
1385-
Py_hash_t hash = PyObject_Hash(key);
1386-
1387-
if (hash == -1) {
1388-
Py_DECREF(key);
1389-
Py_DECREF(it);
1390-
return NULL;
1391-
}
1392-
rv = set_contains_entry(so, key, hash);
1385+
rv = set_contains_key(so, key);
13931386
Py_DECREF(key);
13941387
if (rv < 0) {
13951388
Py_DECREF(it);
@@ -1773,17 +1766,31 @@ PyDoc_STRVAR(issubset_doc, "Report whether another set contains this set.");
17731766
static PyObject *
17741767
set_issuperset(PySetObject *so, PyObject *other)
17751768
{
1776-
PyObject *tmp, *result;
1769+
if (PyAnySet_Check(other)) {
1770+
return set_issubset((PySetObject *)other, (PyObject *)so);
1771+
}
17771772

1778-
if (!PyAnySet_Check(other)) {
1779-
tmp = make_new_set(&PySet_Type, other);
1780-
if (tmp == NULL)
1773+
PyObject *key, *it = PyObject_GetIter(other);
1774+
if (it == NULL) {
1775+
return NULL;
1776+
}
1777+
while ((key = PyIter_Next(it)) != NULL) {
1778+
int rv = set_contains_key(so, key);
1779+
Py_DECREF(key);
1780+
if (rv < 0) {
1781+
Py_DECREF(it);
17811782
return NULL;
1782-
result = set_issuperset(so, tmp);
1783-
Py_DECREF(tmp);
1784-
return result;
1783+
}
1784+
if (!rv) {
1785+
Py_DECREF(it);
1786+
Py_RETURN_FALSE;
1787+
}
17851788
}
1786-
return set_issubset((PySetObject *)other, (PyObject *)so);
1789+
Py_DECREF(it);
1790+
if (PyErr_Occurred()) {
1791+
return NULL;
1792+
}
1793+
Py_RETURN_TRUE;
17871794
}
17881795

17891796
PyDoc_STRVAR(issuperset_doc, "Report whether this set contains another set.");

0 commit comments

Comments
 (0)