summaryrefslogtreecommitdiffstats
path: root/Objects/bytearrayobject.c
diff options
context:
space:
mode:
authorKumar Aditya <59607654+kumaraditya303@users.noreply.github.com>2022-03-15 13:27:30 (GMT)
committerGitHub <noreply@github.com>2022-03-15 13:27:30 (GMT)
commit6dfe09fc5fd5a3ddc6009d5656e635eae30c5240 (patch)
treee9cc5549481c3aa719d1e902f068bc1fa3205b23 /Objects/bytearrayobject.c
parent5dd7ec52b83e7f239774cf7478106fcc7b0a36f3 (diff)
downloadcpython-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.c29
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) {