I have a class Foo and it implements a method compute. I would like to see how long compute takes and where it spends most of its time when executing. To resolve the first problem, I used timeit.default_timer in a loop and averaged:
import numpy as np
from timeit import default_timer as Timer
foo = Foo()
n = int(10e8)
times = np.empty(n)
for i in range(n):
start = Timer()
foo.compute(i)
times[i] = Timer() - start
print(np.sum(times) / times.size)
This tells me what the average execution time of each compute call was, easy enough; except its slower than I thought.
Now I would like to break down the execution profile of compute, but the followingn doesn't seem to do the trick:
import cProfile
for i in range(n):
cProfile.run(foo.compute(i))
I didn't think it would work anyhow, but the docs seem to suggest I would have to put this loop in a method and then profile that loop? So I tried that but it doesn't show whats going on inside compute which is what I desire. How can this be accomplished?
Instead of using
run(), you can userunctx(), which provides arguments to supply globals and locals dictionaries.To aggregate the results from multiple profile runs, see How to calculate the average result of several cProfile results?.