Browse Source
bpo-38219: Optimize dict creating and updating by a dict. (GH-16268)
pull/16381/head
Serhiy Storchaka
7 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
15 additions and
8 deletions
-
Misc/NEWS.d/next/Core and Builtins/2019-09-22-13-56-18.bpo-38219.rFl7JD.rst
-
Objects/dictobject.c
|
|
|
@ -0,0 +1,2 @@ |
|
|
|
Optimized the :class:`dict` constructor and the :meth:`~dict.update` method |
|
|
|
for the case when the argument is a dict. |
|
|
|
@ -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); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|