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.