From 5d858465b6ebdafa05f86309457848cc26913b6a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 20 Nov 2016 10:16:47 +0200 Subject: Added the const qualifier to char* variables that refer to readonly internal UTF-8 represenatation of Unicode objects. --- Objects/setobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Objects/setobject.c') diff --git a/Objects/setobject.c b/Objects/setobject.c index fdb9d3600d..b7e0617db3 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -2398,7 +2398,7 @@ static PyObject * test_c_api(PySetObject *so) { Py_ssize_t count; - char *s; + const char *s; Py_ssize_t i; PyObject *elem=NULL, *dup=NULL, *t, *f, *dup2, *x=NULL; PyObject *ob = (PyObject *)so; -- cgit v1.2.1 From f22b56b777f7134b5c4e6c9caa9249e92c4f4fd9 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 16 Dec 2016 16:18:57 +0200 Subject: Issue #28959: Added private macro PyDict_GET_SIZE for retrieving the size of dict. --- Objects/setobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Objects/setobject.c') diff --git a/Objects/setobject.c b/Objects/setobject.c index b7e0617db3..59ed7955e6 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -981,7 +981,7 @@ set_update_internal(PySetObject *so, PyObject *other) PyObject *value; Py_ssize_t pos = 0; Py_hash_t hash; - Py_ssize_t dictsize = PyDict_Size(other); + Py_ssize_t dictsize = PyDict_GET_SIZE(other); /* Do one big resize at the start, rather than * incrementally resizing as we insert new keys. Expect -- cgit v1.2.1 From 14593e19e199dd34f268b35987ddb288bf022039 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 2 Feb 2017 08:24:48 -0800 Subject: Remove unnecessary variables. * so->used never gets changed during a resize * so->filled only changes when dummies are present and being eliminated --- Objects/setobject.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'Objects/setobject.c') diff --git a/Objects/setobject.c b/Objects/setobject.c index 59ed7955e6..c72c0fae62 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -296,8 +296,6 @@ set_table_resize(PySetObject *so, Py_ssize_t minused) { Py_ssize_t newsize; setentry *oldtable, *newtable, *entry; - Py_ssize_t oldfill = so->fill; - Py_ssize_t oldused = so->used; Py_ssize_t oldmask = so->mask; size_t newmask; int is_oldtable_malloced; @@ -352,21 +350,20 @@ set_table_resize(PySetObject *so, Py_ssize_t minused) /* Make the set empty, using the new table. */ assert(newtable != oldtable); memset(newtable, 0, sizeof(setentry) * newsize); - so->fill = oldused; - so->used = oldused; so->mask = newsize - 1; so->table = newtable; /* Copy the data over; this is refcount-neutral for active entries; dummy entries aren't copied over, of course */ newmask = (size_t)so->mask; - if (oldfill == oldused) { + if (so->fill == so->used) { for (entry = oldtable; entry <= oldtable + oldmask; entry++) { if (entry->key != NULL) { set_insert_clean(newtable, newmask, entry->key, entry->hash); } } } else { + so->fill = so->used; for (entry = oldtable; entry <= oldtable + oldmask; entry++) { if (entry->key != NULL && entry->key != dummy) { set_insert_clean(newtable, newmask, entry->key, entry->hash); -- cgit v1.2.1 From 7a46b9a1dd0da5ef1362330ee4c94ca1fdc06d0c Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 4 Feb 2017 02:43:42 -0800 Subject: Reduce load factor (from 66% to 60%) to improve effectiveness of linear probing. Decreased density gives better collision statistics (average of 2.5 probes in a full table versus 3.0 previously) and fewer occurences of starting a second possibly overlapping sequence of 10 linear probes. Makes resizes a little more frequent but each with less work (fewer insertions and fewer collisions). --- Objects/setobject.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'Objects/setobject.c') diff --git a/Objects/setobject.c b/Objects/setobject.c index c72c0fae62..4f04f49efa 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -234,7 +234,7 @@ set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) so->used++; entry->key = key; entry->hash = hash; - if ((size_t)so->fill*3 < mask*2) + if ((size_t)so->fill*5 < mask*3) return 0; return set_table_resize(so, so->used); @@ -642,7 +642,7 @@ set_merge(PySetObject *so, PyObject *otherset) * incrementally resizing as we insert new keys. Expect * that there will be no (or few) overlapping keys. */ - if ((so->fill + other->used)*3 >= so->mask*2) { + if ((so->fill + other->used)*5 >= so->mask*3) { if (set_table_resize(so, so->used + other->used) != 0) return -1; } @@ -986,7 +986,7 @@ set_update_internal(PySetObject *so, PyObject *other) */ if (dictsize < 0) return -1; - if ((so->fill + dictsize)*3 >= so->mask*2) { + if ((so->fill + dictsize)*5 >= so->mask*3) { if (set_table_resize(so, so->used + dictsize) != 0) return -1; } -- cgit v1.2.1 From 54ab9ca906471f8a49e22c7f85d4f34c2ef7212c Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 6 Feb 2017 10:41:46 +0200 Subject: Issue #29460: _PyArg_NoKeywords(), _PyArg_NoStackKeywords() and _PyArg_NoPositional() now are macros. --- Objects/setobject.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'Objects/setobject.c') diff --git a/Objects/setobject.c b/Objects/setobject.c index 4f04f49efa..2ccf183e3c 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1084,8 +1084,7 @@ frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *iterable = NULL, *result; - if (kwds != NULL && type == &PyFrozenSet_Type - && !_PyArg_NoKeywords("frozenset()", kwds)) + if (type == &PyFrozenSet_Type && !_PyArg_NoKeywords("frozenset()", kwds)) return NULL; if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable)) @@ -2002,7 +2001,7 @@ set_init(PySetObject *self, PyObject *args, PyObject *kwds) { PyObject *iterable = NULL; - if (kwds != NULL && !_PyArg_NoKeywords("set()", kwds)) + if (!_PyArg_NoKeywords("set()", kwds)) return -1; if (!PyArg_UnpackTuple(args, Py_TYPE(self)->tp_name, 0, 1, &iterable)) return -1; -- cgit v1.2.1