This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Title: Optimize update_keyword_args() function
Type: performance Stage: resolved
Components: Versions: Python 3.6
Status: closed Resolution: out of date
Dependencies: Superseder:
Assigned To: Nosy List: serhiy.storchaka, vstinner
Priority: normal Keywords:

Created on 2016-08-23 21:44 by vstinner, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (3)
msg273518 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2016-08-23 21:44
In the review of my issue #27830 "Add _PyObject_FastCallKeywords(): pass keyword arguments as (key, value) pairs", Antoine Pitrou wrote about _PyStack_AsDict():

"It's a pity that you're doing two dict lookups per keyword argument.
Another strategy would be to check that `PyDict_Size() == nk` at the end, and if not, try to find the duplicate keyword."

In fact, I simply copied code from update_keyword_args(), helper function used by do_call() and ext_do_call() in Python/ceval.c.

This function is quite old, the last major change was made in 2001:
changeset:   15711:2481b5fe86d6
branch:      legacy-trunk
user:        Jeremy Hylton <>
date:        Wed Jan 03 23:52:36 2001 +0000
files:       Python/ceval.c
Revised implementation of CALL_FUNCTION and friends.
More revision still needed.


But this change just moved code. It looks like the real code was in fact added by this change made in 2000:
changeset:   12082:603db0d0aed1
branch:      legacy-trunk
user:        Jeremy Hylton <>
date:        Tue Mar 28 23:49:17 2000 +0000
files:       Grammar/Grammar Include/opcode.h Lib/ Misc/ACKS Python/ceval.c Python/compile.c Python/graminit.c
slightly modified version of Greg Ewing's extended call syntax patch

executive summary:
Instead of typing 'apply(f, args, kwargs)' you can type 'f(*arg, **kwargs)'.
Some file-by-file details follow.

msg273681 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2016-08-25 21:45
See also the issue #27358: "BUILD_MAP_UNPACK_WITH_CALL is slow.
msg276023 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2016-09-12 11:42
_PyStack_AsDict() doesn't check anymore if keys are unique.

BUILD_MAP_UNPACK and BUILD_MAP_UNPACK_WITH_CALL opcodes now use PyDict_Update() to combine mappings and _PyDictView_Intersect() to check if keys are unique.

I don't know if there is still something to optimize. The opcode changed the method to C and Python functions (FASTCALL) changed a lot recently ;-)

I suggest to close the issue.
Date User Action Args
2022-04-11 14:58:35adminsetgithub: 72032
2016-09-28 22:05:09serhiy.storchakasetstatus: open -> closed
resolution: out of date
stage: resolved
2016-09-12 11:42:06vstinnersetnosy: + serhiy.storchaka
messages: + msg276023
2016-08-25 21:45:23vstinnersetmessages: + msg273681
2016-08-23 21:44:34vstinnercreate