From 5ed0790562ab01c79399f751cb2ee5943efbd26e Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 9 Nov 2018 01:21:07 -0800 Subject: [PATCH 1/2] Optimize set.pop() to advance a pointer instead of indexing. --- Objects/setobject.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Objects/setobject.c b/Objects/setobject.c index 42fe80fc050362..99a7f8b8218789 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -701,8 +701,7 @@ static PyObject * set_pop(PySetObject *so, PyObject *Py_UNUSED(ignored)) { /* Make sure the search finger is in bounds */ - Py_ssize_t i = so->finger & so->mask; - setentry *entry; + setentry *entry, *limit; PyObject *key; assert (PyAnySet_Check(so)); @@ -711,16 +710,18 @@ set_pop(PySetObject *so, PyObject *Py_UNUSED(ignored)) return NULL; } - while ((entry = &so->table[i])->key == NULL || entry->key==dummy) { - i++; - if (i > so->mask) - i = 0; + entry = so->table + (so->finger & so->mask); + limit = so->table + so->mask; + while (entry->key == NULL || entry->key==dummy) { + entry++; + if (entry > limit) + entry = so->table; } key = entry->key; entry->key = dummy; entry->hash = -1; so->used--; - so->finger = i + 1; /* next place to start */ + so->finger = entry - so->table; /* next place to start */ return key; } From 48f1f8aab12759d0ecae81c86c9aae66de2b21d1 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 9 Nov 2018 02:11:56 -0800 Subject: [PATCH 2/2] Fix missing +1 logic to skip over the current entry --- Objects/setobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/setobject.c b/Objects/setobject.c index 99a7f8b8218789..ce5092195975d5 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -721,7 +721,7 @@ set_pop(PySetObject *so, PyObject *Py_UNUSED(ignored)) entry->key = dummy; entry->hash = -1; so->used--; - so->finger = entry - so->table; /* next place to start */ + so->finger = entry - so->table + 1; /* next place to start */ return key; }