Optimize common case for dict.fromkeys().

This commit is contained in:
Raymond Hettinger 2007-11-09 23:14:44 +00:00
parent d3d0baf0a1
commit 34448790db
1 changed files with 15 additions and 10 deletions

View File

@ -1191,7 +1191,7 @@ dict_fromkeys(PyObject *cls, PyObject *args)
PyObject *key; PyObject *key;
long hash; long hash;
if (dictresize(mp, ((PyDictObject *)seq)->ma_used)) if (dictresize(mp, PySet_GET_SIZE(seq)))
return NULL; return NULL;
while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) { while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
@ -1227,19 +1227,24 @@ dict_fromkeys(PyObject *cls, PyObject *args)
return NULL; return NULL;
} }
for (;;) { if (PyDict_CheckExact(d)) {
key = PyIter_Next(it); while ((key = PyIter_Next(it)) != NULL) {
if (key == NULL) { status = PyDict_SetItem(d, key, value);
if (PyErr_Occurred()) 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; 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); Py_DECREF(it);
return d; return d;