tracemalloc — Speicherreservierungen aufzeichnen¶
Added in version 3.4.
Quellcode: Lib/tracemalloc.py
Das Modul tracemalloc ist ein Werkzeug zur Fehlersuche. Es zeichnet auf, welche Speicherblöcke Python reserviert, und liefert dazu:
den Traceback der Stelle, an der ein Objekt reserviert wurde
Statistiken über reservierte Speicherblöcke je Datei und je Zeilennummer: Gesamtgröße, Anzahl und durchschnittliche Größe der reservierten Speicherblöcke
die Unterschiede zwischen zwei Snapshots, um Speicherlecks zu finden
Damit möglichst viele der von Python reservierten Speicherblöcke erfasst werden, sollte das Modul so früh wie möglich starten: indem du die Umgebungsvariable PYTHONTRACEMALLOC auf 1 setzt oder die Befehlszeilenoption -X tracemalloc verwendest. Zur Laufzeit lässt sich die Aufzeichnung mit tracemalloc.start() starten.
Standardmäßig hält ein Trace zu einem reservierten Speicherblock nur den jüngsten Frame fest, also einen. Um beim Start 25 Frames festzuhalten, setze die Umgebungsvariable PYTHONTRACEMALLOC auf 25 oder verwende die Befehlszeilenoption -X tracemalloc=25.
Beispiele¶
Die zehn größten anzeigen¶
Die zehn Dateien anzeigen, die am meisten Speicher reservieren:
import tracemalloc
tracemalloc.start()
# ... run your application ...
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
print("[ Top 10 ]")
for stat in top_stats[:10]:
print(stat)
Beispielausgabe aus der Python-Testsuite:
[ Top 10 ]
<frozen importlib._bootstrap>:716: size=4855 KiB, count=39328, average=126 B
<frozen importlib._bootstrap>:284: size=521 KiB, count=3199, average=167 B
/usr/lib/python3.4/collections/__init__.py:368: size=244 KiB, count=2315, average=108 B
/usr/lib/python3.4/unittest/case.py:381: size=185 KiB, count=779, average=243 B
/usr/lib/python3.4/unittest/case.py:402: size=154 KiB, count=378, average=416 B
/usr/lib/python3.4/abc.py:133: size=88.7 KiB, count=347, average=262 B
<frozen importlib._bootstrap>:1446: size=70.4 KiB, count=911, average=79 B
<frozen importlib._bootstrap>:1454: size=52.0 KiB, count=25, average=2131 B
<string>:5: size=49.7 KiB, count=148, average=344 B
/usr/lib/python3.4/sysconfig.py:411: size=48.0 KiB, count=1, average=48.0 KiB
Man sieht: Python hat 4855 KiB Daten aus Modulen geladen, Bytecode und Konstanten, und das Modul collections hat 244 KiB reserviert, um namedtuple-Typen zu erzeugen.
Weitere Möglichkeiten stehen bei Snapshot.statistics().
Unterschiede berechnen¶
Zwei Snapshots nehmen und die Unterschiede anzeigen:
import tracemalloc
tracemalloc.start()
# ... start your application ...
snapshot1 = tracemalloc.take_snapshot()
# ... call the function leaking memory ...
snapshot2 = tracemalloc.take_snapshot()
top_stats = snapshot2.compare_to(snapshot1, 'lineno')
print("[ Top 10 differences ]")
for stat in top_stats[:10]:
print(stat)
Beispielausgabe vor und nach einigen Tests aus der Python-Testsuite:
[ Top 10 differences ]
<frozen importlib._bootstrap>:716: size=8173 KiB (+4428 KiB), count=71332 (+39369), average=117 B
/usr/lib/python3.4/linecache.py:127: size=940 KiB (+940 KiB), count=8106 (+8106), average=119 B
/usr/lib/python3.4/unittest/case.py:571: size=298 KiB (+298 KiB), count=589 (+589), average=519 B
<frozen importlib._bootstrap>:284: size=1005 KiB (+166 KiB), count=7423 (+1526), average=139 B
/usr/lib/python3.4/mimetypes.py:217: size=112 KiB (+112 KiB), count=1334 (+1334), average=86 B
/usr/lib/python3.4/http/server.py:848: size=96.0 KiB (+96.0 KiB), count=1 (+1), average=96.0 KiB
/usr/lib/python3.4/inspect.py:1465: size=83.5 KiB (+83.5 KiB), count=109 (+109), average=784 B
/usr/lib/python3.4/unittest/mock.py:491: size=77.7 KiB (+77.7 KiB), count=143 (+143), average=557 B
/usr/lib/python3.4/urllib/parse.py:476: size=71.8 KiB (+71.8 KiB), count=969 (+969), average=76 B
/usr/lib/python3.4/contextlib.py:38: size=67.2 KiB (+67.2 KiB), count=126 (+126), average=546 B
Man sieht: Python hat 8173 KiB Moduldaten geladen, Bytecode und Konstanten, und damit 4428 KiB mehr als vor den Tests, als der vorige Snapshot entstand. Ebenso hat das Modul linecache 940 KiB Python-Quellcode zwischengespeichert, um Tracebacks zu formatieren – alles davon seit dem vorigen Snapshot.
Hat das System wenig freien Speicher, lassen sich Snapshots mit der Methode Snapshot.dump() auf die Platte schreiben und später auswerten. Zum Zurückladen dient die Methode Snapshot.load().
Den Traceback eines Speicherblocks holen¶
Code, der den Traceback des größten Speicherblocks anzeigt:
import tracemalloc
# Store 25 frames
tracemalloc.start(25)
# ... run your application ...
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('traceback')
# pick the biggest memory block
stat = top_stats[0]
print("%s memory blocks: %.1f KiB" % (stat.count, stat.size / 1024))
for line in stat.traceback.format():
print(line)
Beispielausgabe aus der Python-Testsuite, Traceback auf 25 Frames begrenzt:
903 memory blocks: 870.1 KiB
File "<frozen importlib._bootstrap>", line 716
File "<frozen importlib._bootstrap>", line 1036
File "<frozen importlib._bootstrap>", line 934
File "<frozen importlib._bootstrap>", line 1068
File "<frozen importlib._bootstrap>", line 619
File "<frozen importlib._bootstrap>", line 1581
File "<frozen importlib._bootstrap>", line 1614
File "/usr/lib/python3.4/doctest.py", line 101
import pdb
File "<frozen importlib._bootstrap>", line 284
File "<frozen importlib._bootstrap>", line 938
File "<frozen importlib._bootstrap>", line 1068
File "<frozen importlib._bootstrap>", line 619
File "<frozen importlib._bootstrap>", line 1581
File "<frozen importlib._bootstrap>", line 1614
File "/usr/lib/python3.4/test/support/__init__.py", line 1728
import doctest
File "/usr/lib/python3.4/test/test_pickletools.py", line 21
support.run_doctest(pickletools)
File "/usr/lib/python3.4/test/regrtest.py", line 1276
test_runner()
File "/usr/lib/python3.4/test/regrtest.py", line 976
display_failure=not verbose)
File "/usr/lib/python3.4/test/regrtest.py", line 761
match_tests=ns.match_tests)
File "/usr/lib/python3.4/test/regrtest.py", line 1563
main()
File "/usr/lib/python3.4/test/__main__.py", line 3
regrtest.main_in_temp_cwd()
File "/usr/lib/python3.4/runpy.py", line 73
exec(code, run_globals)
File "/usr/lib/python3.4/runpy.py", line 160
"__main__", fname, loader, pkg_name)
Man sieht: Der meiste Speicher wurde im Modul importlib reserviert, um Daten aus Modulen zu laden, Bytecode und Konstanten: 870.1 KiB. Der Traceback zeigt, wo importlib zuletzt Daten geladen hat, nämlich in der Zeile import pdb des Moduls doctest. Der Traceback kann sich ändern, wenn ein neues Modul geladen wird.
Hübsche Bestenliste¶
Code, der die zehn Zeilen mit dem meisten reservierten Speicher hübsch ausgibt und dabei die Dateien <frozen importlib._bootstrap> und <unknown> übergeht:
import linecache
import os
import tracemalloc
def display_top(snapshot, key_type='lineno', limit=10):
snapshot = snapshot.filter_traces((
tracemalloc.Filter(False, "<frozen importlib._bootstrap>"),
tracemalloc.Filter(False, "<unknown>"),
))
top_stats = snapshot.statistics(key_type)
print("Top %s lines" % limit)
for index, stat in enumerate(top_stats[:limit], 1):
frame = stat.traceback[0]
print("#%s: %s:%s: %.1f KiB"
% (index, frame.filename, frame.lineno, stat.size / 1024))
line = linecache.getline(frame.filename, frame.lineno).strip()
if line:
print(' %s' % line)
other = top_stats[limit:]
if other:
size = sum(stat.size for stat in other)
print("%s other: %.1f KiB" % (len(other), size / 1024))
total = sum(stat.size for stat in top_stats)
print("Total allocated size: %.1f KiB" % (total / 1024))
tracemalloc.start()
# ... run your application ...
snapshot = tracemalloc.take_snapshot()
display_top(snapshot)
Beispielausgabe aus der Python-Testsuite:
Top 10 lines
#1: Lib/base64.py:414: 419.8 KiB
_b85chars2 = [(a + b) for a in _b85chars for b in _b85chars]
#2: Lib/base64.py:306: 419.8 KiB
_a85chars2 = [(a + b) for a in _a85chars for b in _a85chars]
#3: collections/__init__.py:368: 293.6 KiB
exec(class_definition, namespace)
#4: Lib/abc.py:133: 115.2 KiB
cls = super().__new__(mcls, name, bases, namespace)
#5: unittest/case.py:574: 103.1 KiB
testMethod()
#6: Lib/linecache.py:127: 95.4 KiB
lines = fp.readlines()
#7: urllib/parse.py:476: 71.8 KiB
for a in _hexdig for b in _hexdig}
#8: <string>:5: 62.0 KiB
#9: Lib/_weakrefset.py:37: 60.0 KiB
self.data = set()
#10: Lib/base64.py:142: 59.8 KiB
_b32tab2 = [a + b for a in _b32tab for b in _b32tab]
6220 other: 3602.8 KiB
Total allocated size: 5303.1 KiB
Weitere Möglichkeiten stehen bei Snapshot.statistics().
Aktuelle und höchste Größe aller aufgezeichneten Speicherblöcke festhalten¶
Der folgende Code berechnet zwei Summen der Art 0 + 1 + 2 + ... auf umständliche Weise, nämlich über eine Liste dieser Zahlen. Diese Liste braucht vorübergehend viel Speicher. Mit get_traced_memory() und reset_peak() lassen sich der geringe Speicherbedarf nach der Berechnung und der Höchstwert während der Berechnung beobachten:
import tracemalloc
tracemalloc.start()
# Example code: compute a sum with a large temporary list
large_sum = sum(list(range(100000)))
first_size, first_peak = tracemalloc.get_traced_memory()
tracemalloc.reset_peak()
# Example code: compute a sum with a small temporary list
small_sum = sum(list(range(1000)))
second_size, second_peak = tracemalloc.get_traced_memory()
print(f"{first_size=}, {first_peak=}")
print(f"{second_size=}, {second_peak=}")
Ausgabe:
first_size=664, first_peak=3592984
second_size=804, second_peak=29704
Dank reset_peak() ließ sich der Höchstwert während der Berechnung von small_sum genau festhalten, obwohl er weit unter dem Höchstwert aller Speicherblöcke seit dem Aufruf von start() liegt. Ohne den Aufruf von reset_peak() wäre second_peak noch der Höchstwert aus der Berechnung von large_sum, also gleich first_peak. Hier liegen beide Höchstwerte weit über dem Speicherbedarf am Ende, was auf Verbesserungspotenzial hindeutet: Der unnötige Aufruf von list kann weg, es genügt sum(range(...)).
API¶
Funktionen¶
- tracemalloc.clear_traces()¶
Verwirft die Traces der von Python reservierten Speicherblöcke.
Siehe auch
stop().
- tracemalloc.get_object_traceback(obj)¶
Holt den Traceback der Stelle, an der das Python-Objekt obj reserviert wurde. Zurückgegeben wird eine Instanz von
TracebackoderNone, wenn das Modultracemallockeine Reservierungen aufzeichnet oder die Reservierung dieses Objekts nicht aufgezeichnet hat.Siehe auch die Funktionen
gc.get_referrers()undsys.getsizeof().
- tracemalloc.get_traceback_limit()¶
Holt die größte Anzahl an Frames, die im Traceback eines Traces festgehalten werden.
Das Modul
tracemallocmuss Reservierungen aufzeichnen, damit sich die Grenze holen lässt, sonst wird eine Ausnahme ausgelöst.Die Grenze setzt die Funktion
start().
- tracemalloc.get_traced_memory()¶
Holt die aktuelle und die höchste Größe der vom Modul
tracemallocaufgezeichneten Speicherblöcke als Tupel(current: int, peak: int).
- tracemalloc.reset_peak()¶
Setzt die höchste Größe der vom Modul
tracemallocaufgezeichneten Speicherblöcke auf die aktuelle Größe.Tut nichts, wenn das Modul
tracemallockeine Reservierungen aufzeichnet.Diese Funktion ändert nur den festgehaltenen Höchstwert. Anders als
clear_traces()ändert oder verwirft sie keine Traces. Snapshots vontake_snapshot()vor einem Aufruf vonreset_peak()lassen sich daher sinnvoll mit Snapshots nach dem Aufruf vergleichen.Siehe auch
get_traced_memory().Added in version 3.9.
- tracemalloc.get_tracemalloc_memory()¶
Holt den Speicherbedarf des Moduls
tracemallocin Byte, den es zum Festhalten der Traces von Speicherblöcken braucht. Zurückgegeben wird einint.
- tracemalloc.is_tracing()¶
True, wenn das ModultracemallocReservierungen von Python-Speicher aufzeichnet, sonstFalse.
- tracemalloc.start(nframe: int = 1)¶
Beginnt, Reservierungen von Python-Speicher aufzuzeichnen: Dazu werden Einhängepunkte in den Speicherverwaltungen von Python gesetzt. Die gesammelten Tracebacks der Traces sind auf nframe Frames begrenzt. Standardmäßig hält ein Trace zu einem Speicherblock nur den jüngsten Frame fest, die Grenze ist also
1. nframe muss größer oder gleich1sein.Wie viele Frames der Traceback ursprünglich hatte, lässt sich weiterhin am Attribut
Traceback.total_nframeablesen.Mehr als
1Frame festzuhalten lohnt nur für Statistiken, die nach'traceback'gruppiert sind, oder für kumulierte Statistiken. Siehe die MethodenSnapshot.compare_to()undSnapshot.statistics().Mehr Frames festzuhalten erhöht den Speicher- und Rechenaufwand des Moduls
tracemalloc. Wie viel Speicher das Modultracemallocbraucht, misst die Funktionget_tracemalloc_memory().Mit der Umgebungsvariablen
PYTHONTRACEMALLOC(PYTHONTRACEMALLOC=NFRAME) und der Befehlszeilenoption-Xtracemalloc=NFRAMElässt sich die Aufzeichnung schon beim Start beginnen.Siehe auch die Funktionen
stop(),is_tracing()undget_traceback_limit().
- tracemalloc.stop()¶
Beendet die Aufzeichnung von Reservierungen in Python-Speicher: Die Einhängepunkte in den Speicherverwaltungen von Python werden entfernt. Außerdem werden alle bisher gesammelten Traces von Python reservierter Speicherblöcke verworfen.
Mit der Funktion
take_snapshot()lässt sich vor dem Verwerfen ein Snapshot der Traces nehmen.Siehe auch die Funktionen
start(),is_tracing()undclear_traces().
- tracemalloc.take_snapshot()¶
Nimmt einen Snapshot der Traces von Python reservierter Speicherblöcke. Zurückgegeben wird eine neue Instanz von
Snapshot.Speicherblöcke, die vor dem Beginn der Aufzeichnung durch das Modul
tracemallocreserviert wurden, enthält der Snapshot nicht.Die Tracebacks der Traces sind auf
get_traceback_limit()Frames begrenzt. Für mehr Frames dient der Parameter nframe der Funktionstart().Das Modul
tracemallocmuss Reservierungen aufzeichnen, damit sich ein Snapshot nehmen lässt. Siehe die Funktionstart().Siehe auch die Funktion
get_object_traceback().
DomainFilter¶
- class tracemalloc.DomainFilter(inclusive: bool, domain: int)¶
Filtert Traces von Speicherblöcken nach ihrem Adressraum (Domain).
Added in version 3.6.
- inclusive¶
Ist inclusive gleich
True(einschließen), passen die Speicherblöcke, die im Adressraumdomainreserviert wurden.Ist inclusive gleich
False(ausschließen), passen die Speicherblöcke, die nicht im Adressraumdomainreserviert wurden.
- domain¶
Adressraum eines Speicherblocks (
int). Nur lesbares Property.
Filter¶
- class tracemalloc.Filter(inclusive: bool, filename_pattern: str, lineno: int = None, all_frames: bool = False, domain: int = None)¶
Filter für Traces von Speicherblöcken.
Die Syntax von filename_pattern steht bei der Funktion
fnmatch.fnmatch(). Die Dateiendung'.pyc'wird durch'.py'ersetzt.Beispiele:
Filter(True, subprocess.__file__)schließt nur Traces des ModulssubprocesseinFilter(False, tracemalloc.__file__)schließt Traces des ModulstracemallocausFilter(False, "<unknown>")schließt leere Tracebacks aus
Geändert in Version 3.5: Die Dateiendung
'.pyo'wird nicht mehr durch'.py'ersetzt.Geändert in Version 3.6: Das Attribut
domainwurde hinzugefügt.- domain¶
Adressraum eines Speicherblocks (
intoderNone).tracemalloc verwendet die Domain
0, um Reservierungen von Python aufzuzeichnen. C-Erweiterungen können andere Domains nutzen, um andere Ressourcen aufzuzeichnen.
- inclusive¶
Ist inclusive gleich
True(einschließen), passen nur die Speicherblöcke, die in einer Datei mit einem zufilename_patternpassenden Namen in Zeilelinenoreserviert wurden.Ist inclusive gleich
False(ausschließen), bleiben die Speicherblöcke außer Betracht, die in einer Datei mit einem zufilename_patternpassenden Namen in Zeilelinenoreserviert wurden.
- lineno¶
Zeilennummer (
int) des Filters. Ist lineno gleichNone, passt der Filter auf jede Zeilennummer.
- filename_pattern¶
Dateinamensmuster des Filters (
str). Nur lesbares Property.
- all_frames¶
Ist all_frames gleich
True, werden alle Frames des Tracebacks geprüft. Ist all_frames gleichFalse, nur der jüngste Frame.Dieses Attribut bleibt ohne Wirkung, wenn die Traceback-Grenze
1ist. Siehe die Funktionget_traceback_limit()und das AttributSnapshot.traceback_limit.
Frame¶
Snapshot¶
- class tracemalloc.Snapshot¶
Snapshot der Traces von Python reservierter Speicherblöcke.
Die Funktion
take_snapshot()erzeugt eine Snapshot-Instanz.- compare_to(old_snapshot: Snapshot, key_type: str, cumulative: bool = False)¶
Berechnet die Unterschiede zu einem älteren Snapshot. Geliefert wird eine nach key_type gruppierte, sortierte Liste von
StatisticDiff-Instanzen.Zu den Parametern key_type und cumulative siehe die Methode
Snapshot.statistics().Das Ergebnis ist absteigend sortiert nach: Betrag von
StatisticDiff.size_diff,StatisticDiff.size, Betrag vonStatisticDiff.count_diff,Statistic.countund schließlichStatisticDiff.traceback.
- filter_traces(filters)¶
Erzeugt eine neue
Snapshot-Instanz mit gefiltertertraces-Sequenz. filters ist eine Liste vonDomainFilter- undFilter-Instanzen. Ist filters eine leere Liste, kommt eine neueSnapshot-Instanz mit einer Kopie der Traces zurück.Alle einschließenden Filter greifen zugleich. Ein Trace bleibt außer Betracht, wenn kein einschließender Filter auf ihn passt. Ein Trace bleibt ebenso außer Betracht, wenn mindestens ein ausschließender Filter auf ihn passt.
Geändert in Version 3.6: In filters sind jetzt auch
DomainFilter-Instanzen erlaubt.
- statistics(key_type: str, cumulative: bool = False)¶
Liefert eine nach key_type gruppierte, sortierte Liste von
Statistic-Instanzen:key_type
Beschreibung
'filename'Dateiname
'lineno'Dateiname und Zeilennummer
'traceback'Traceback
Ist cumulative gleich
True, werden Größe und Anzahl der Speicherblöcke über alle Frames des Tracebacks eines Traces summiert, nicht nur über den jüngsten Frame. Dieser kumulierende Modus ist nur mit key_type gleich'filename'oder'lineno'möglich.Das Ergebnis ist absteigend sortiert nach:
Statistic.size,Statistic.countund schließlichStatistic.traceback.
- traceback_limit¶
Größte Anzahl an Frames, die im Traceback von
tracesfestgehalten sind: das Ergebnis vonget_traceback_limit()zum Zeitpunkt des Snapshots.
- traces¶
Traces aller von Python reservierten Speicherblöcke: eine Sequenz von
Trace-Instanzen.Die Reihenfolge der Sequenz ist nicht festgelegt. Eine sortierte Liste von Statistiken liefert die Methode
Snapshot.statistics().
Statistic¶
- class tracemalloc.Statistic¶
Statistik über Speicherreservierungen.
Snapshot.statistics()gibt eine Liste vonStatistic-Instanzen zurück.Siehe auch die Klasse
StatisticDiff.- count¶
Anzahl der Speicherblöcke (
int).
- size¶
Gesamtgröße der Speicherblöcke in Byte (
int).
StatisticDiff¶
- class tracemalloc.StatisticDiff¶
Unterschied der Statistik über Speicherreservierungen zwischen einer älteren und einer neueren
Snapshot-Instanz.Snapshot.compare_to()gibt eine Liste vonStatisticDiff-Instanzen zurück. Siehe auch die KlasseStatistic.- count¶
Anzahl der Speicherblöcke im neuen Snapshot (
int):0, wenn die Speicherblöcke im neuen Snapshot freigegeben sind.
- count_diff¶
Unterschied in der Anzahl der Speicherblöcke zwischen altem und neuem Snapshot (
int).
- size¶
Gesamtgröße der Speicherblöcke in Byte im neuen Snapshot (
int):0, wenn die Speicherblöcke im neuen Snapshot freigegeben sind.
- size_diff¶
Unterschied in der Gesamtgröße der Speicherblöcke in Byte zwischen altem und neuem Snapshot (
int).
Trace¶
- class tracemalloc.Trace¶
Trace eines Speicherblocks.
Das Attribut
Snapshot.tracesist eine Sequenz vonTrace-Instanzen.Geändert in Version 3.6: Das Attribut
domainwurde hinzugefügt.- domain¶
Adressraum eines Speicherblocks (
int). Nur lesbares Property.tracemalloc verwendet die Domain
0, um Reservierungen von Python aufzuzeichnen. C-Erweiterungen können andere Domains nutzen, um andere Ressourcen aufzuzeichnen.
- size¶
Größe des Speicherblocks in Byte (
int).
Traceback¶
- class tracemalloc.Traceback¶
Sequenz von
Frame-Instanzen, sortiert vom ältesten zum jüngsten Frame.Ein Traceback enthält mindestens
1Frame. Konnte das Modultracemalloceinen Frame nicht ermitteln, wird der Dateiname"<unknown>"mit Zeilennummer0verwendet.Beim Nehmen eines Snapshots werden die Tracebacks der Traces auf
get_traceback_limit()Frames begrenzt. Siehe die Funktiontake_snapshot(). Die ursprüngliche Anzahl der Frames steht im AttributTraceback.total_nframe. Daran lässt sich erkennen, ob die Traceback-Grenze einen Traceback abgeschnitten hat.Das Attribut
Trace.tracebackist eine Instanz vonTraceback.Geändert in Version 3.7: Frames sind jetzt vom ältesten zum jüngsten sortiert, nicht mehr vom jüngsten zum ältesten.
- total_nframe¶
Gesamtzahl der Frames, aus denen der Traceback vor dem Abschneiden bestand. Dieses Attribut kann
Nonesein, wenn die Information nicht vorliegt.
Geändert in Version 3.9: Das Attribut
Traceback.total_nframewurde hinzugefügt.- format(limit=None, most_recent_first=False)¶
Formatiert den Traceback als Liste von Zeilen. Die Zeilen des Quellcodes holt das Modul
linecache. Ist limit gesetzt und positiv, werden die limit jüngsten Frames formatiert, andernfalls dieabs(limit)ältesten. Ist most_recent_first gleichTrue, wird die Reihenfolge der formatierten Frames umgekehrt, der jüngste Frame steht dann zuerst statt zuletzt.Ähnlich wie die Funktion
traceback.format_tb(), nur enthältformat()keine Zeilenumbrüche.Beispiel:
print("Traceback (most recent call first):") for line in traceback.format(most_recent_first=True): print(line)
Ausgabe:
Traceback (most recent call first): File "test.py", line 9 obj = Object() File "test.py", line 12 tb = tracemalloc.get_object_traceback(f())