bpo-8425: Fast path for set inplace difference when the second set is large (GH-15590)

This commit is contained in:
Raymond Hettinger 2019-08-29 09:02:58 -07:00 committed by GitHub
parent 4901fe274b
commit 88ea166dad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 2 deletions

View File

@ -0,0 +1,3 @@
Optimize set difference_update for the case when the other set is much
larger than the base set. (Suggested by Evgeny Kapun with code contributed
by Michele Orrù).

View File

@ -1463,9 +1463,25 @@ set_difference_update_internal(PySetObject *so, PyObject *other)
setentry *entry;
Py_ssize_t pos = 0;
while (set_next((PySetObject *)other, &pos, &entry))
if (set_discard_entry(so, entry->key, entry->hash) < 0)
/* Optimization: When the other set is more than 8 times
larger than the base set, replace the other set with
interesection of the two sets.
*/
if ((PySet_GET_SIZE(other) >> 3) > PySet_GET_SIZE(so)) {
other = set_intersection(so, other);
if (other == NULL)
return -1;
} else {
Py_INCREF(other);
}
while (set_next((PySetObject *)other, &pos, &entry))
if (set_discard_entry(so, entry->key, entry->hash) < 0) {
Py_DECREF(other);
return -1;
}
Py_DECREF(other);
} else {
PyObject *key, *it;
it = PyObject_GetIter(other);