You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
In the review of my issue bpo-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 <jeremy@alum.mit.edu>
date: Wed Jan 03 23:52:36 2001 +0000
files: Python/ceval.c
description:
Revised implementation of CALL_FUNCTION and friends.
More revision still needed.
_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 ;-)
Activity
vstinner commentedon Aug 23, 2016
In the review of my issue bpo-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() == nkat the end, and if not, try to find the duplicate keyword."https://bugs.python.org/review/27830/diff/18203/Objects/abstract.c#newcode2326_Objects/abstract.c:2326
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 <jeremy@alum.mit.edu>
date: Wed Jan 03 23:52:36 2001 +0000
files: Python/ceval.c
description:
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 <jeremy@alum.mit.edu>
date: Tue Mar 28 23:49:17 2000 +0000
files: Grammar/Grammar Include/opcode.h Lib/dis.py Misc/ACKS Python/ceval.c Python/compile.c Python/graminit.c
description:
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.
(...)
---
vstinner commentedon Aug 25, 2016
See also the issue bpo-27358: "BUILD_MAP_UNPACK_WITH_CALL is slow.
vstinner commentedon Sep 12, 2016
_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.