Skip to content

[3.12] cProfile counts 0 primitive calls for builtins.exec in certain scenario #106152

Description

@jacobtylerwalls

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

Linked PRs

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

3.12only security fixes3.13only security fixestype-bugAn unexpected behavior, bug, or error

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions