We currently use cProfile for deterministic profiling and pyinstrument for statistical profiling.

We maintain a fork of pyinstrument where we stage changes that we want to merge upstream.

Proposed Data Format


type: trace
version: 1
  - description: some_function_name
    self_time: 10.45  # number of seconds spent in this function that was not spent in functions called from within this function
      - description: inner_function  # This function was called by some_function_name()
        self_time: 1.456
      - description: another_function
        self_time: 0  # No appreciable time was spent in this function, all of the time was spent in the function it calls.
          - description: even_deeper
            self_time: 14.631
  - description: another_function
    self_time: 1.2  # This call to another_function does not result in a call to "even_deeper()" and does spend some time doing stuff. Note that appears separately in the data.