This document is one of More SageMath Tutorials. You may edit it on github. \(\def\NN{\mathbb{N}}\) \(\def\ZZ{\mathbb{Z}}\) \(\def\QQ{\mathbb{Q}}\) \(\def\RR{\mathbb{R}}\) \(\def\CC{\mathbb{C}}\)
A micro demo of profiling Sage / Python code (draft)¶
This is a brief demo presented at Sage Days 86. See also Profiling.
We will analyze the performances of integer partitions of \(45\). Here is how many of them there are:
sage: P = Partitions(45)
sage: P.cardinality()
89134
The next command measures how much time it takes to list them all. Before running it, try to estimate the result:
sage: %time x = list(P)
CPU times: user 1.95 s, sys: 40 ms, total: 1.99 s
Wall time: 1.94 s
One can get statistics on how much time is used in each subfunction call:
sage: %prun x = list(P)
This is not so easy to analyze. A graphical visualization would be much nicer!
Graphical visualization with \(snakeviz\)¶
Installation:
sage -pip install snakeviz
This works locally only; we can hope for a tighter integration in the notebook in the long run.
We now load the extension in the notebook:
sage: %load_ext snakeviz
Let’s use it:
sage: %snakeviz x = list(P)
*** Profile stats marshalled to file u'/tmp/...'.
Graphical visualization with \(runsnake\)¶
I find the output easier to intepret with \(runsnake\); but this may just be a bias from having used it quite some. On the other hand it’s not integrated in the browser and harder to install.
Installation on Linux:
sage: apt install runsnakerun
For other systems, see the web page.
Let’s use it:
sage: runsnake("list(P)")
Todo
Add a demo of using the Python debugger to trace through the code.