Skip to content
Permalink
Browse files

bpo-39028: Performance enhancement in keyword extraction (GH-17576)

All keywords should first be checked for pointer identity. Only
after that failed for all keywords (unlikely) should unicode
equality be used.
The original code would call unicode equality on any non-matching
keyword argument. Meaning calling it often e.g. when a function
has many kwargs but only the last one is provided.
  • Loading branch information
seberg authored and methane committed Dec 18, 2019
1 parent 50d4f12 commit 75bb07e92baa7267a61056d03d7e6b475588e793
Showing with 8 additions and 3 deletions.
  1. +1 −0 Misc/NEWS.d/next/Core and Builtins/2019-12-17-23-20-51.bpo-39028.SND4TB.rst
  2. +7 −3 Python/getargs.c
@@ -0,0 +1 @@
Slightly improve the speed of keyword argument parsing with many kwargs by strengthening the assumption that kwargs are interned strings.
@@ -2053,14 +2053,18 @@ find_keyword(PyObject *kwnames, PyObject *const *kwstack, PyObject *key)
Py_ssize_t i, nkwargs;

nkwargs = PyTuple_GET_SIZE(kwnames);
for (i=0; i < nkwargs; i++) {
for (i = 0; i < nkwargs; i++) {
PyObject *kwname = PyTuple_GET_ITEM(kwnames, i);

/* ptr==ptr should match in most cases since keyword keys
should be interned strings */
/* kwname == key will normally find a match in since keyword keys
should be interned strings; if not retry below in a new loop. */
if (kwname == key) {
return kwstack[i];
}
}

for (i = 0; i < nkwargs; i++) {
PyObject *kwname = PyTuple_GET_ITEM(kwnames, i);
assert(PyUnicode_Check(kwname));
if (_PyUnicode_EQ(kwname, key)) {
return kwstack[i];

0 comments on commit 75bb07e

Please sign in to comment.
You can’t perform that action at this time.