diff options
author | Victor Stinner <vstinner@python.org> | 2020-10-27 21:24:33 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-27 21:24:33 (GMT) |
commit | 35b95aaf21534e4a8e3370dfd6f7482265316c9e (patch) | |
tree | 1f0bb3bbeb1c8389b1cd43408f17e0d17c748b7d /Modules/_collectionsmodule.c | |
parent | c310185c081110741fae914c06c7aaf673ad3d0d (diff) | |
download | cpython-35b95aaf21534e4a8e3370dfd6f7482265316c9e.zip cpython-35b95aaf21534e4a8e3370dfd6f7482265316c9e.tar.gz cpython-35b95aaf21534e4a8e3370dfd6f7482265316c9e.tar.bz2 |
bpo-42161: Micro-optimize _collections._count_elements() (GH-23008)
Move the _PyLong_GetOne() call outside the fast-path loop.
Diffstat (limited to 'Modules/_collectionsmodule.c')
-rw-r--r-- | Modules/_collectionsmodule.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c index 8990071..1578750 100644 --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -2278,6 +2278,7 @@ _collections__count_elements_impl(PyObject *module, PyObject *mapping, PyObject *dict_get; PyObject *mapping_setitem; PyObject *dict_setitem; + PyObject *one = _PyLong_GetOne(); // borrowed reference it = PyObject_GetIter(iterable); if (it == NULL) @@ -2324,10 +2325,10 @@ _collections__count_elements_impl(PyObject *module, PyObject *mapping, if (oldval == NULL) { if (PyErr_Occurred()) goto done; - if (_PyDict_SetItem_KnownHash(mapping, key, _PyLong_GetOne(), hash) < 0) + if (_PyDict_SetItem_KnownHash(mapping, key, one, hash) < 0) goto done; } else { - newval = PyNumber_Add(oldval, _PyLong_GetOne()); + newval = PyNumber_Add(oldval, one); if (newval == NULL) goto done; if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) < 0) @@ -2336,13 +2337,13 @@ _collections__count_elements_impl(PyObject *module, PyObject *mapping, } Py_DECREF(key); } - } else { + } + else { bound_get = _PyObject_GetAttrId(mapping, &PyId_get); if (bound_get == NULL) goto done; PyObject *zero = _PyLong_GetZero(); // borrowed reference - PyObject *one = _PyLong_GetOne(); // borrowed reference while (1) { key = PyIter_Next(it); if (key == NULL) |