From f163aeaa8c15b806b622c9cb10bc1d2a6e034e24 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 25 Sep 2019 09:47:00 +0300 Subject: [PATCH] bpo-38219: Optimize dict creating and updating by a dict. (GH-16268) --- .../2019-09-22-13-56-18.bpo-38219.rFl7JD.rst | 2 ++ Objects/dictobject.c | 21 ++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-09-22-13-56-18.bpo-38219.rFl7JD.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-09-22-13-56-18.bpo-38219.rFl7JD.rst b/Misc/NEWS.d/next/Core and Builtins/2019-09-22-13-56-18.bpo-38219.rFl7JD.rst new file mode 100644 index 0000000000..8d621cfb82 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-09-22-13-56-18.bpo-38219.rFl7JD.rst @@ -0,0 +1,2 @@ +Optimized the :class:`dict` constructor and the :meth:`~dict.update` method +for the case when the argument is a dict. diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 2f24105835..2f86946b98 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2317,17 +2317,22 @@ dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, result = -1; } else if (arg != NULL) { - _Py_IDENTIFIER(keys); - PyObject *func; - if (_PyObject_LookupAttrId(arg, &PyId_keys, &func) < 0) { - result = -1; - } - else if (func != NULL) { - Py_DECREF(func); + if (PyDict_CheckExact(arg)) { result = PyDict_Merge(self, arg, 1); } else { - result = PyDict_MergeFromSeq2(self, arg, 1); + _Py_IDENTIFIER(keys); + PyObject *func; + if (_PyObject_LookupAttrId(arg, &PyId_keys, &func) < 0) { + result = -1; + } + else if (func != NULL) { + Py_DECREF(func); + result = PyDict_Merge(self, arg, 1); + } + else { + result = PyDict_MergeFromSeq2(self, arg, 1); + } } } -- 2.40.0