2 Stimmen

Das Testen des Zusammenfügens von Listen mit einem 60-MB-String mit `timeit` führt zu einem MemoryError

Meine Testanwendung fügt eine Liste hinzu, die eine 60MB lange Zeichenfolge und eine 5-Byte lange Zeichenfolge enthält. Diese Liste wird dann mit join() verbunden:

import timeit
setup_str = 'str_5byte = "\xfa\xea\x02\x02\x02"; L = [str_5byte]; str_60mb = str_5byte * 12000000'
t = timeit.Timer('L.append(str_60mb); str_long = "".join(L)', setup=setup_str)
t.timeit(100)

Wirft diese Ausnahme zurück:

Traceback (most recent call last):
  File "", line 1, in 
  File "C:\Python25\lib\timeit.py", line 161, in timeit
    timing = self.inner(it, self.timer)
  File "", line 6, in inner
MemoryError

Ich nehme an, dass die Variablen nach jeder Ausführung gelöscht und vom Garbage Collector aufgeräumt werden, also warum geht mir der Speicher aus? Das Testen mit 8 Ausführungen ist in Ordnung, aber bei mehr als das erhalte ich diesen Fehler.

1voto

Ja, mit t.timeit wird die Einrichtungsanweisung nur einmal ausgeführt und dann die Testanweisung mehrmals. Dies bedeutet, dass die Liste L persistiert und bei jeder Iteration wächst, was offensichtlich dazu führt, dass Ihr System nicht genügend Speicherplatz hat.

Versuchen Sie min(t.repeat(repeat=100, number=1)), um die Einrichtung jedes Mal vor der Auswertung der Testanweisung auszuführen.

Hier sind die Dokumente, falls Sie weitere Informationen benötigen.

0voto

Wayne Werner Punkte 45176

Bei einem schnellen Experiment bin ich mir ziemlich sicher, dass setup genau das Gegenteil von dem tut, was du erwartest - es wird vor jedem Aufruf ausgeführt. Du bekommst also jedes Mal zusätzliche 60 MB, die nicht eingesammelt werden. Wenn ich diesen Setup-Code direkt in den Testcode verschiebe, kann ich ihn ausführen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X