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

diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 2f24105..2f86946 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -2317,17 +2317,22 @@
         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);
+            }
         }
     }