Slow functions calls for C-coded functions, accepting positional-or-kwarg argument vs positional-only
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 35.9k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Bug report
Bug description:
I don't see measurable difference on pure-Python level, e.g. for
# a.py
import pyperf
def f1(x):
return 1
def f2(x, /):
return 1
runner = pyperf.Runner()
runner.bench_func("f1(1)", f1, 1)
runner.bench_func("f2(1)", f2, 1)
I got on 3.13:
$ python a.py -q
f1(1): Mean +- std dev: 233 ns +- 2 ns
f2(1): Mean +- std dev: 232 ns +- 2 ns
But for functions, implemented in C, using the Argument Clinic - the difference is bigger:
$ python bench.py -q -o patch.json
isfinite(1.0): Mean +- std dev: 152 ns +- 1 ns
$ git checkout master && make -s
Checked 114 modules (35 built-in, 78 shared, 1 n/a on linux-x86_64, 0 disabled, 0 missing, 0 failed on import)
$ python bench.py -q -o ref.json
isfinite(1.0): Mean +- std dev: 136 ns +- 1 ns
| Benchmark | ref | patch |
|---|---|---|
| isfinite(1.0) | 136 ns | 152 ns: 1.12x slower |
(In the second version - the math.isfinite() accept also keyword argument x)
a patch
(run ./python Tools/clinic/clinic.py Modules/mathmodule.c !)
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index 7c2a421dd6..e33281ac8b 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -3156,14 +3156,13 @@ math_radians_impl(PyObject *module, double x)
math.isfinite
x: double
- /
Return True if x is neither an infinity nor a NaN, and False otherwise.
[clinic start generated code]*/
static PyObject *
math_isfinite_impl(PyObject *module, double x)
-/*[clinic end generated code: output=8ba1f396440c9901 input=46967d254812e54a]*/
+/*[clinic end generated code: output=8ba1f396440c9901 input=a47ad6e72998b81d]*/
{
return PyBool_FromLong((long)isfinite(x));
}
This performance penalty affects API decisions (e.g. https://github.com/python/cpython/pull/131886) and that looks as a bug.
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Linked PRs
- gh-136732
- gh-137202
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par le benchmark dans bench.py et les exemples de pyperf, en comparant math.isfinite(1.0) pour les formes positional-only et positional-or-keyword. Examinez Modules/mathmodule.c ainsi que la sortie d’Argument Clinic générée par Tools/clinic/clinic.py ; le travail est terminé lorsque l’appel codé en C ne présente plus la régression signalée, tandis que le benchmark et le comportement de l’API restent corrects.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- c, python
- Domaine
- performance
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 30/100