From 2b4f5e1f2f71d5470e2b9e2b47f5cf6883209964 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 2 Nov 2026 16:38:28 +0100 Subject: [PATCH 1/2] gh-160147: Optimize make_new_set_untracked() There is no need to set PySetObject explicitly to 0/NULL, since _PyType_AllocNoTrack() already initialize memory to zeros. --- Objects/setobject.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Objects/setobject.c b/Objects/setobject.c index a762edf5933e185..d21a27d01eca5d3 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1348,19 +1348,20 @@ static PyObject * make_new_set_untracked(PyTypeObject *type, PyObject *iterable) { assert(PyType_Check(type)); - PySetObject *so; - so = (PySetObject *)_PyType_AllocNoTrack(type, 0); - if (so == NULL) + // Initialize PySetObject members to 0/NULL + PySetObject *so = (PySetObject *)_PyType_AllocNoTrack(type, 0); + if (so == NULL) { return NULL; + } - so->fill = 0; - so->used = 0; + assert(so->fill == 0); + assert(so->used == 0); so->mask = PySet_MINSIZE - 1; so->table = so->smalltable; so->hash = -1; - so->finger = 0; - so->weakreflist = NULL; + assert(so->finger == 0); + assert(so->weakreflist == NULL); if (iterable != NULL) { if (set_update_local(so, iterable)) { From 7cf34f3f980441f0ad7e86dd2da665e7a543e0cf Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 4 Nov 2026 00:57:43 +0100 Subject: [PATCH 2/2] Update Objects/setobject.c Co-authored-by: Pieter Eendebak --- Objects/setobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/setobject.c b/Objects/setobject.c index d21a27d01eca5d3..8c5f244d4894d8a 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1349,7 +1349,7 @@ make_new_set_untracked(PyTypeObject *type, PyObject *iterable) { assert(PyType_Check(type)); - // Initialize PySetObject members to 0/NULL + // fields are zero-initialized by _PyType_AllocNoTrack PySetObject *so = (PySetObject *)_PyType_AllocNoTrack(type, 0); if (so == NULL) { return NULL;