[Python-checkins] gh-92914: Round the allocated size for lists up to the even number (GH-92915) (GH-92942)

ambv webhook-mailer at python.org
Tue Jun 7 04:54:50 EDT 2022


https://github.com/python/cpython/commit/9204364e4095bcf6c0b2471d4ed8546d8748b44b
commit: 9204364e4095bcf6c0b2471d4ed8546d8748b44b
branch: 3.10
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: ambv <lukasz at langa.pl>
date: 2022-06-07T10:54:40+02:00
summary:

gh-92914: Round the allocated size for lists up to the even number (GH-92915) (GH-92942)

(cherry picked from commit 8a6af5a34642f5564220eb50d72caada8f17fc78)

Co-authored-by: Serhiy Storchaka <storchaka at gmail.com>

files:
A Misc/NEWS.d/next/Core and Builtins/2022-05-18-08-32-33.gh-issue-92914.tJUeTD.rst
M Lib/test/test_sys.py
M Objects/listobject.c

diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py
index a0458092553b4c..3c362485d9fe06 100644
--- a/Lib/test/test_sys.py
+++ b/Lib/test/test_sys.py
@@ -1317,9 +1317,10 @@ def get_gen(): yield 1
         import re
         check(re.finditer('',''), size('2P'))
         # list
-        samples = [[], [1,2,3], ['1', '2', '3']]
-        for sample in samples:
-            check(list(sample), vsize('Pn') + len(sample)*self.P)
+        check(list([]), vsize('Pn'))
+        check(list([1]), vsize('Pn') + 2*self.P)
+        check(list([1, 2]), vsize('Pn') + 2*self.P)
+        check(list([1, 2, 3]), vsize('Pn') + 4*self.P)
         # sortwrapper (list)
         # XXX
         # cmpwrapper (list)
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-05-18-08-32-33.gh-issue-92914.tJUeTD.rst b/Misc/NEWS.d/next/Core and Builtins/2022-05-18-08-32-33.gh-issue-92914.tJUeTD.rst
new file mode 100644
index 00000000000000..1242a15c029dc1
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-05-18-08-32-33.gh-issue-92914.tJUeTD.rst	
@@ -0,0 +1 @@
+Always round the allocated size for lists up to the nearest even number.
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 7f37b7386051d0..329fd1f9741a58 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -95,6 +95,12 @@ list_preallocate_exact(PyListObject *self, Py_ssize_t size)
     assert(self->ob_item == NULL);
     assert(size > 0);
 
+    /* Since the Python memory allocator has granularity of 16 bytes on 64-bit
+     * platforms (8 on 32-bit), there is no benefit of allocating space for
+     * the odd number of items, and there is no drawback of rounding the
+     * allocated size up to the nearest even number.
+     */
+    size = (size + 1) & ~(size_t)1;
     PyObject **items = PyMem_New(PyObject*, size);
     if (items == NULL) {
         PyErr_NoMemory();



More information about the Python-checkins mailing list