[Python-checkins] bpo-38219: Optimize dict creating and updating by a dict. (GH-16268)

Serhiy Storchaka webhook-mailer at python.org
Wed Sep 25 02:47:04 EDT 2019


https://github.com/python/cpython/commit/f163aeaa8c15b806b622c9cb10bc1d2a6e034e24
commit: f163aeaa8c15b806b622c9cb10bc1d2a6e034e24
branch: master
author: Serhiy Storchaka <storchaka at gmail.com>
committer: GitHub <noreply at github.com>
date: 2019-09-25T09:47:00+03:00
summary:

bpo-38219: Optimize dict creating and updating by a dict. (GH-16268)

files:
A Misc/NEWS.d/next/Core and Builtins/2019-09-22-13-56-18.bpo-38219.rFl7JD.rst
M Objects/dictobject.c

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 000000000000..8d621cfb826a
--- /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 2f2410583512..2f86946b985f 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);
+            }
         }
     }
 



More information about the Python-checkins mailing list