Skip to content

Commit 971c000

Browse files
committed
📝 Add Memray as a profile tool
1 parent 4470a56 commit 971c000

File tree

3 files changed

+101
-2
lines changed

3 files changed

+101
-2
lines changed

docs/performance/index.rst

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,9 @@ Performance-Messungen
7171

7272
Wenn ihr erst einmal mit eurem Code gearbeitet habt, kann es nützlich sein, die
7373
Effizienz genauer zu untersuchen. Hierfür kann :abbr:`z. B. (zum Beispiel)`
74-
:doc:`cProfile <tracing>`, :doc:`ipython-profiler`, :doc:`scalene` oder
75-
:doc:`tprof` genutzt werden. Bisher führe ich meist die folgenden Schritte aus:
74+
:doc:`cProfile <tracing>`, :doc:`ipython-profiler`, :doc:`scalene`, :doc:`tprof`
75+
oder :doc:`memray` genutzt werden. Bisher führe ich meist die folgenden Schritte
76+
aus:
7677

7778
#. Ich profilierte das gesamte Programm mit :doc:`cProfile <tracing>` oder
7879
`py-spy <https://github.com/benfred/py-spy>`_, um langsame Funktionen zu
@@ -110,6 +111,7 @@ Effizienz genauer zu untersuchen. Hierfür kann :abbr:`z. B. (zum Beispiel)`
110111
ipython-profiler.ipynb
111112
scalene.ipynb
112113
tprof
114+
memray
113115
tachyon
114116

115117
Suche nach bestehenden Implementierungen
490 KB
Loading

docs/performance/memray.rst

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
.. SPDX-FileCopyrightText: 2026 Veit Schiele
2+
..
3+
.. SPDX-License-Identifier: BSD-3-Clause
4+
5+
Memray
6+
======
7+
8+
Die Speichernutzung ist in Python-Projekten nur schwer zu kontrollieren, da die
9+
Sprache nicht explizit deutlich macht, wo Speicher zugewiesen wird, Modulimporte
10+
können den Verbrauch erheblich steigern, und es ist nur allzu leicht, eine
11+
Datenstruktur zu erstellen, die versehentlich unbegrenzt wächst.
12+
Data-Science-Projekte sind besonders anfällig für hohen Speicherverbrauch, da
13+
sie meist viele große Abhängigkeiten wie :doc:`/workspace/numpy/index`
14+
importieren, selbst wenn diese nur an wenigen Stellen verwendet werden.
15+
16+
`Memray <https://bloomberg.github.io/memray/>`_ hilft euch, die Speichernutzung
17+
eures Programms zu verstehen, wobei nachverfolgt wird, wo während der
18+
Programmausführung Speicher zugewiesen und freigegeben wird. Diese Daten können
19+
dann auf verschiedene Weise dargestellt werden, :abbr:`u. a. (uter anderem)`
20+
werden in `Flame Graphs <https://www.brendangregg.com/flamegraphs.html>`_ die
21+
`Stacktraces <https://de.wikipedia.org/wiki/Stacktrace>`_ in einem Diagramm
22+
zusammengefasst, wobei die Balkenbreite die Größe der Speicherzuweisung
23+
darstellt.
24+
25+
Mit ``memray run`` kann jeder Python-Befehl profiliert werden. Für die meisten
26+
Projekte empfiehlt sich, zunächst mit ``check`` die Funktion zu profilieren, die
27+
euer Projekt lädt. Damit wird der Mindestaufwand überprüft, der zum Starten
28+
eurer Anwendung erforderlich ist, :abbr:`z.B. (zum Beispiel)`:
29+
30+
.. code-block:: console
31+
32+
$ uv run memray run src/items/__init__.py check
33+
Writing profile results into src/items/memray-__init__.py.72633.bin
34+
[memray] Successfully generated profile results.
35+
36+
You can now generate reports from the stored allocation records.
37+
Some example commands to generate reports:
38+
39+
/Users/veit/items/.venv/bin/python3 -m memray flamegraph src/items/memray-__init__.py.72633.bin
40+
41+
Der Befehl gibt die Meldung ``Successfully generated profile results.`` aus und
42+
erstellt eine Datei :samp:`{PROCESS-ID}.bin`-Datei. Den *Flame Graph* können wir
43+
dann erstellen mit:
44+
45+
.. code-block:: console
46+
47+
$ uv run python -m memray flamegraph src/items/memray-__init__.py.72633.bin
48+
Wrote src/items/memray-flamegraph-__init__.py.72633.html
49+
50+
.. tip::
51+
In vielen Konsolen könnt ihr die beiden Befehle zusammenfassen mit ``&&``:
52+
53+
.. code-block:: console
54+
55+
$ uv run memray run src/items/__init__.py check && uv run python -m memray flamegraph src/items/memray-__init__.py.72633.bin
56+
57+
Das Ergebnis ist folgende HTML-Datei:
58+
59+
.. figure:: memray-flamegraph.png
60+
:alt: memray flamegraph report
61+
62+
memray flamegraph report
63+
64+
Der Kopfbereich der Seite enthält einige Steuerelemente, :abbr: `u.a. (unter anderem)` zu
65+
66+
*Memory Graph*
67+
Anzeige des Speicherplatzes eines Prozesses im Arbeitsspeicher (`Resident
68+
set size <https://en.wikipedia.org/wiki/Resident_set_size>`_) und des
69+
`dynamischen Speichers
70+
<https://de.wikipedia.org/wiki/Dynamischer_Speicher>`_ (Heap Memory) über
71+
die Zeit
72+
*Stats*
73+
Speicherstatistiken, in diesem Fall
74+
75+
.. code-block:: text
76+
77+
Command line: /Users/veit/items/.venv/bin/memray run src/items/api.py check
78+
Start time: Sun Feb 08 2026 12:12:27 GMT+0100 (Central European Standard Time)
79+
End time: Sun Feb 08 2026 12:12:27 GMT+0100 (Central European Standard Time)
80+
Duration: 0:00:00.068000
81+
Total number of allocations: 11142
82+
Total number of frames seen: 0
83+
Peak memory usage: 4.6 MB
84+
Python allocator: pymalloc
85+
86+
Darunter befindet sich der *Flame-Graph* als Eiszapfendiagramm mit den
87+
Speicherzuweisungen über die Zeit, wobei der letzte Aufruf ganz unten steht. Die
88+
Grafik zeigt die zu einem bestimmten Zeitpunkt ausgeführte Codezeile an wobei
89+
die Breite proportional zur zugewiesenen Speichermenge ist; bewegt ihr die Maus
90+
darüber, seht ihr weitere Details wie Dateiname, Zeilennummer, zugewiesener
91+
Speicher und Anzahl der Zuweisungen.
92+
93+
.. tip::
94+
Mit :ref:`python-basics:pytest_memray` gibt es auch ein Plugin für
95+
:doc:`python-basics:test/pytest/index`, mit dem ihr überprüfen könnt, ob
96+
von euch festgelegte Obergrenzen für den Speicherverbrauch und Speicherlecks
97+
eingehalten werden.

0 commit comments

Comments
 (0)