diff options
author | Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> | 2022-03-15 13:27:30 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-15 13:27:30 (GMT) |
commit | 6dfe09fc5fd5a3ddc6009d5656e635eae30c5240 (patch) | |
tree | e9cc5549481c3aa719d1e902f068bc1fa3205b23 /Objects/bytearrayobject.c | |
parent | 5dd7ec52b83e7f239774cf7478106fcc7b0a36f3 (diff) | |
download | cpython-6dfe09fc5fd5a3ddc6009d5656e635eae30c5240.zip cpython-6dfe09fc5fd5a3ddc6009d5656e635eae30c5240.tar.gz cpython-6dfe09fc5fd5a3ddc6009d5656e635eae30c5240.tar.bz2 |
bpo-46993: Speed up bytearray creation from list and tuple (GH-31834)
Diffstat (limited to 'Objects/bytearrayobject.c')
-rw-r--r-- | Objects/bytearrayobject.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 0ebb2ec..3493ff0 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -844,8 +844,33 @@ bytearray___init___impl(PyByteArrayObject *self, PyObject *arg, return -1; } - /* XXX Optimize this if the arguments is a list, tuple */ - + if (PyList_CheckExact(arg) || PyTuple_CheckExact(arg)) { + Py_ssize_t size = PySequence_Fast_GET_SIZE(arg); + if (PyByteArray_Resize((PyObject *)self, size) < 0) { + return -1; + } + PyObject **items = PySequence_Fast_ITEMS(arg); + char *s = PyByteArray_AS_STRING(self); + for (Py_ssize_t i = 0; i < size; i++) { + int value; + if (!PyLong_CheckExact(items[i])) { + /* Resize to 0 and go through slowpath */ + if (Py_SIZE(self) != 0) { + if (PyByteArray_Resize((PyObject *)self, 0) < 0) { + return -1; + } + } + goto slowpath; + } + int rc = _getbytevalue(items[i], &value); + if (!rc) { + return -1; + } + s[i] = value; + } + return 0; + } +slowpath: /* Get the iterator */ it = PyObject_GetIter(arg); if (it == NULL) { |