From 2bc4d95bb67a0bcddec5b76e7f7b5d10b098aa49 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 2 Jun 2014 22:22:42 +0200 Subject: Issue #21233: Revert bytearray(int) optimization using calloc() --- Doc/whatsnew/3.5.rst | 5 ++--- Misc/NEWS | 7 +++---- Objects/bytearrayobject.c | 16 ++-------------- 3 files changed, 7 insertions(+), 21 deletions(-) diff --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst index b879ede..5c4e0b5 100644 --- a/Doc/whatsnew/3.5.rst +++ b/Doc/whatsnew/3.5.rst @@ -196,9 +196,8 @@ Optimizations The following performance enhancements have been added: -* Construction of ``bytes(int)`` and ``bytearray(int)`` (filled by zero bytes) - is faster and use less memory (until the bytearray buffer is filled with - data) for large objects. ``calloc()`` is used instead of ``malloc()`` to +* Construction of ``bytes(int)`` (filled by zero bytes) is faster and use less + memory for large objects. ``calloc()`` is used instead of ``malloc()`` to allocate memory for these objects. * Some operations on :class:`~ipaddress.IPv4Network` and diff --git a/Misc/NEWS b/Misc/NEWS index be02bba..af084b8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -26,10 +26,9 @@ Core and Builtins internal iteration logic. - Issue #21233: Add new C functions: PyMem_RawCalloc(), PyMem_Calloc(), - PyObject_Calloc(), _PyObject_GC_Calloc(). bytes(int) and bytearray(int) - are now using ``calloc()`` instead of ``malloc()`` for large objects which - is faster and use less memory (until the bytearray buffer is filled with - data). + PyObject_Calloc(), _PyObject_GC_Calloc(). bytes(int) is now using + ``calloc()`` instead of ``malloc()`` for large objects which is faster and + use less memory. - Issue #21377: PyBytes_Concat() now tries to concatenate in-place when the first argument has a reference count of 1. Patch by Nikolaus Rath. diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 68b9c4a..5b75705 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -813,21 +813,9 @@ bytearray_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds) } else { if (count > 0) { - void *sval; - Py_ssize_t alloc; - - assert (Py_SIZE(self) == 0); - - alloc = count + 1; - sval = PyObject_Calloc(1, alloc); - if (sval == NULL) + if (PyByteArray_Resize((PyObject *)self, count)) return -1; - - PyObject_Free(self->ob_bytes); - - self->ob_bytes = self->ob_start = sval; - Py_SIZE(self) = count; - self->ob_alloc = alloc; + memset(PyByteArray_AS_STRING(self), 0, count); } return 0; } -- cgit v0.12