summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2007-11-09 23:14:44 +0000
committerRaymond Hettinger <python@rcn.com>2007-11-09 23:14:44 +0000
commitb4fae82f12f8c8ea8b34644ff7c29514a2a25a0d (patch)
tree13e018caefe47b8898da13db2d2ebd228c7c0f84
parent719d658f3df80d72b2952b32cfa1330aae2baec8 (diff)
downloadcpython-b4fae82f12f8c8ea8b34644ff7c29514a2a25a0d.tar.gz
Optimize common case for dict.fromkeys().
-rw-r--r--Objects/dictobject.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 00f9bc8b2f..978071b1c1 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -1191,7 +1191,7 @@ dict_fromkeys(PyObject *cls, PyObject *args)
PyObject *key;
long hash;
- if (dictresize(mp, ((PyDictObject *)seq)->ma_used))
+ if (dictresize(mp, PySet_GET_SIZE(seq)))
return NULL;
while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
@@ -1227,19 +1227,24 @@ dict_fromkeys(PyObject *cls, PyObject *args)
return NULL;
}
- for (;;) {
- key = PyIter_Next(it);
- if (key == NULL) {
- if (PyErr_Occurred())
+ if (PyDict_CheckExact(d)) {
+ while ((key = PyIter_Next(it)) != NULL) {
+ status = PyDict_SetItem(d, key, value);
+ Py_DECREF(key);
+ if (status < 0)
+ goto Fail;
+ }
+ } else {
+ while ((key = PyIter_Next(it)) != NULL) {
+ status = PyObject_SetItem(d, key, value);
+ Py_DECREF(key);
+ if (status < 0)
goto Fail;
- break;
}
- status = PyObject_SetItem(d, key, value);
- Py_DECREF(key);
- if (status < 0)
- goto Fail;
}
+ if (PyErr_Occurred())
+ goto Fail;
Py_DECREF(it);
return d;