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
{{ message }}
Repository navigation
Argument Clinic: improve generated parser for 1-argument functions #67680
Proposed patch improve generated parsers for functions with single positional argument. Now they always generated as METH_O and PyArg_Parse() is used to parse single argument.
To avoid code churn in this and following changes it would be worth to extract all generated code in separated files.
I'm not opposed to the patch in principle. I assume your goal is to make Python faster--do you have any data on how much faster?
I don't support immediately changing all uses of Argument Clinic to generate their code into a separate file. I would want to see a consensus from the community first. Perhaps we should discuss it (again?) on python-dev?
This is one step on long way. Second step will be to inline PyArg_Parse for
some format codes ("i", "U", "y*", "O&", "O!"). Then we could try to expand
PyArg_ParseTuple, at least for simple common cases. Then
PyArg_ParseTupleAndKeywords. All this step will produce large diffs for
generated code.
Serhiy, I suggest you look at the code that Cython generates for its functions. It has been extensively profiled and optimised (years ago), so generating the same code for the argument clinic should yield the same performance.
And while I don't have exact numbers at hand, avoiding the tuple packing for the call by passing it into a METH_O function can make a substantial difference. It also kills support for keyword arguments, though.
Serhiy, I suggest you look at the code that Cython generates for its functions. It has been extensively profiled and optimised (years ago), so generating the same code for the argument clinic should yield the same performance.
Thanks, I'll look on it.
And while I don't have exact numbers at hand, avoiding the tuple packing for the call by passing it into a METH_O function can make a substantial difference.
Good idea. Here are samples:
$ ./python -m timeit "chr(0x20ac)"
Unpatched: 1000000 loops, best of 3: 0.976 usec per loop
Patched: 1000000 loops, best of 3: 0.752 usec per loop
$ ./python -m timeit -s "from cmath import isnan; x = 1j" -- "isnan(x)"
Unpatched: 1000000 loops, best of 3: 0.62 usec per loop
Patched: 1000000 loops, best of 3: 0.386 usec per loop
Of course for more complex functions the effect is smaller.
Activity
serhiy-storchaka commentedon Feb 20, 2015
Proposed patch improve generated parsers for functions with single positional argument. Now they always generated as METH_O and PyArg_Parse() is used to parse single argument.
To avoid code churn in this and following changes it would be worth to extract all generated code in separated files.
larryhastings commentedon Feb 20, 2015
I'm not opposed to the patch in principle. I assume your goal is to make Python faster--do you have any data on how much faster?
I don't support immediately changing all uses of Argument Clinic to generate their code into a separate file. I would want to see a consensus from the community first. Perhaps we should discuss it (again?) on python-dev?
serhiy-storchaka commentedon Feb 20, 2015
This is one step on long way. Second step will be to inline PyArg_Parse for
some format codes ("i", "U", "y*", "O&", "O!"). Then we could try to expand
PyArg_ParseTuple, at least for simple common cases. Then
PyArg_ParseTupleAndKeywords. All this step will produce large diffs for
generated code.
scoder commentedon Feb 21, 2015
Serhiy, I suggest you look at the code that Cython generates for its functions. It has been extensively profiled and optimised (years ago), so generating the same code for the argument clinic should yield the same performance.
And while I don't have exact numbers at hand, avoiding the tuple packing for the call by passing it into a METH_O function can make a substantial difference. It also kills support for keyword arguments, though.
larryhastings commentedon Feb 21, 2015
Stefan: Serhiy's patch only affects functions taking a single positional-only parameter.
larryhastings commentedon Feb 21, 2015
lgtm
serhiy-storchaka commentedon Feb 21, 2015
Thanks, I'll look on it.
Good idea. Here are samples:
Of course for more complex functions the effect is smaller.
serhiy-storchaka commentedon Feb 21, 2015
After expanding PyArg_Parse for "i" and "D" codes above tests give following results:
About twice in comparison with initial variant!
pitrou commentedon Feb 22, 2015
Let's make Argument Clinic a fierce optimizer!
(+1 on this)
python-dev commentedon Apr 3, 2015
New changeset e10ad4d4d490 by Serhiy Storchaka in branch 'default':
Issue bpo-23492: Argument Clinic now generates argument parsing code with
https://hg.python.org/cpython/rev/e10ad4d4d490
python-dev commentedon Apr 4, 2015
New changeset 973c9ec53bbb by Serhiy Storchaka in branch 'default':
Fixed the array module broken in issue bpo-23492.
https://hg.python.org/cpython/rev/973c9ec53bbb