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 00000000000..8d621cfb826 --- /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 2f241058351..2f86946b985 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); + } } }