Visualizing the Results of Profiling Python Code

If you've ever profiled a Python program, you probably know about the
cProfile module in the standard library. Examining the output of
cProfile is not easy, as it requires you to remember incantations like
p.sort_stats('time').print_stats(10). And if you see that a lot of time is
spent in some function deep inside numpy, you'll have a hard time figuring out
who exactly is calling that function. Fortunately, there are some good
visualization tools out there. I will describe two of them: pyprof2calltree
and pyinstrument.

pyprof2calltree allows you to visualize cProfile
results using KCacheGrind, which might be familiar from your C days. Install it
with:

pip install pyprof2calltree

Profile your program as usual:

python -m cProfile -o prof.out mycode.py

Then visualize the results in KCacheGrind:

pyprof2calltree -i prof.out -k

This gives you a visualization of the call graph, and how much time is spent in
each function:

The other tool, pyinstrument, works entirely on the
command line. Install it with:

pip install pyinstrument

Run your program like this:

python -m pyinstrument mycode.py

And you get a nice color-coded call tree that tells you where the time is
spent:

I really like the simplicity of pyinstrument, and I think it will become my
go-to Python profiler from now on. The only problem I noticed was that
pyinstrument seems unable to track time spent in C-extension calls, so if you
have any Cython code, you will not see how much time is spent there. (cProfile
+ pyprof2calltree don't seem to have this limitation.)