Closed
Description
Bug report
In 3.12, cProfile can count 0 primitive calls and miscalculate cumulative time in the following scenario.
For this layout:
script.py project/ typing.py
And the file contents:
script.py
import project.typing
project/typing.py
from typing import Protocol class A(Protocol): ...
I observe this behavior difference with python3 -m cProfile script.py
:
3.11.2
697 function calls (693 primitive calls) in 0.001 seconds Ordered by: cumulative time ncalls tottime percall cumtime percall filename:lineno(function) 2/1 0.000 0.000 0.001 0.001 {built-in method builtins.exec} 1 0.000 0.000 0.001 0.001 script.py:1(<module>)
3.12.0b3
635 function calls (630 primitive calls) in 0.001 seconds Ordered by: cumulative time ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 0.001 0.001 script.py:1(<module>) ... 1/0 0.000 0.000 0.000 {built-in method builtins.exec}
Notice the division by zero causing a missing percall
stat for exec.
This means that in more substantial examples, the profiler will omit a significant portion of the relevant cumulative time. See this output for a 14.286 second script, I only have access to a cumtime for 0.800:
45856453 function calls (31647888 primitive calls) in 14.286 seconds Ordered by: cumulative time ncalls tottime percall cumtime percall filename:lineno(function) 4054 0.005 0.000 0.800 0.000 modutils.py:620(_spec_from_modpath) ...
Your environment
- CPython versions tested on: Python 3.12.0b3
- Operating system and architecture: MacOS 13.4.1