pstats.Stats.get_stats_profile can't handle functions with the same name
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 36k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Bug report
Bug description:
MCVE
import cProfile
import time
import pstats
class A:
def foo(self):
time.sleep(1)
class B:
def foo(self):
time.sleep(2)
pr = cProfile.Profile()
pr.enable()
A().foo()
B().foo()
pr.create_stats()
ps = pstats.Stats(pr).sort_stats("cumtime")
ps.print_stats(5)
when I ran this in a jupyter notebook, this outputted:
61 function calls in 3.003 seconds
Ordered by: cumulative time
List reduced from 21 to 5 due to restriction <5>
ncalls tottime percall cumtime percall filename:lineno(function)
3 0.000 0.000 3.003 1.001 /usr/local/my_venv/lib/python3.10/site-packages/IPython/core/interactiveshell.py:3424(run_code)
3 0.000 0.000 3.002 1.001 {built-in method builtins.exec}
2 3.002 1.501 3.002 1.501 {built-in method time.sleep}
1 0.000 0.000 2.002 2.002 /usr/tmp/ipykernel_104016/1099215389.py:12(foo)
1 0.000 0.000 1.000 1.000 /usr/tmp/ipykernel_104016/1099215389.py:7(foo)
which correctly shows two different versions of a function called foo. However, due to the API design of get_stats_profile, only one of the functions will be stored in the dict FunctionProfile.func_profiles, the one which is last in the insertion order, which in this case since I sorted by cumtime will be A.foo:
print(ps.get_stats_profile().func_profiles["foo"])
outputs:
FunctionProfile(ncalls='1', tottime=0.0, percall_tottime=0.0, cumtime=1.0, percall_cumtime=1.0, file_name='/usr/tmp/ipykernel_104016/1099215389.py', line_number=7)
Maybe get_stats_profile should key the func_profile dictionary on something that's actually unique per profile entry, like filename:lineno(function)?
CPython versions tested on:
3.10
Operating systems tested on:
Linux
Linked PRs
- gh-149618
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 pstats.Stats.get_stats_profile et examinez comment FunctionProfile.func_profiles est alimenté et indexé. Reproduisez la MCVE fournie avec A.foo et B.foo, puis vérifiez que les deux fonctions portant le même nom restent distinguables dans les données de profil renvoyées.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- tooling
- Type d'issue
- Bug
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100