2016-12-29 2 views
0

Ich habe ein Skript, das dauert etwa 10 Minuten auf meinem lokalen Rechner ausgeführt werden. Zu Beginn des Skripts muss ich einige ziemlich große Listen erstellen und sie durchlaufen, um verschiedene Aufräumfunktionen auszuführen, wodurch neue Listen der bereinigten Daten erstellt werden. Gibt es eine Standardmethode zum Löschen/Bewahren von Speicher währenddessen?Löschen/Bewahren Speicher in Python

Mein erster Gedanke war, einfach die Variable auf eine leere Liste zurückzusetzen, nachdem ich es getan bin mit:

lst = [1,2,3, toinfinity..] 
clean_lst = [x for x in l if x < infinity] 
lst = [] 
cleaner_lst = [x for x in clean_lst if x > 100] 
clean_lst = [] 
# etc... 
+2

sicher ... im Allgemeinen Python Garbage Collection nur –

+1

arbeiten Sie können auch mit 'del' erforderlich. http://stackoverflow.com/questions/6146963/when-is-del-useful-in-python – NPE

+1

Warum müssen Sie Ihre eigene Laufzeit-Speicherverwaltung durchführen? Wenn Sie in Python wie in den meisten Sprachen den Speicher freigeben, wird das Laufzeit-System es an den verfügbaren Heap zurückgeben. Es in Python zu veröffentlichen hat einfach keine Referenzen mehr auf das Datenobjekt. – Prune

Antwort

1

Ohne einen größeren Code Kontext, sicher zu wissen, ist es schwierig zu wissen, ob diese Antwort nützlich ist , aber tou unter der Annahme, braucht nicht die ursprüngliche Liste zu behalten:

einfach die Listen selbst mit der gereinigten Version ersetzen:

lst = [1,2,3, toinfinity..] 
lst = [x for x in lst if x < infinity] 
lst = [x for x in lst if x > 100] 

im allgemeinen Pyth Auf Griffe Müllabfuhr ziemlich gut. In diesem Fall und unter der Annahme, dass Sie die Originale nicht benötigen, wird beim Erstellen der Transientenlisten nur Speicher verwendet, den Sie nicht verwenden müssen.

1

Erstens: Wenn ich Sie wäre, würde ich meinen Code-Profil, zum Beispiel durch diese Anrufe Einkapseln Sie in Funktion erwähnt, und ruft

import cProfile 
cProfile.run("my_function()") 

später waren ich auf den kleinen Optimierungen konzentrieren, wie Sie angefordert in der Post (! stattdessen auf REAL Leistung Schweinen der Fokussierung), würde ich Code ersetzen oben mit:

some_list = [x for x in range(infinity) if x > 100 and x < infinity] 
# replacing range with xrange in python2 

aber das wäre nur ein Schritt, bevor ich über das Konvertieren diese eckigen Klammern in der normal diejenigen denken würde, das Umwandeln meine Liste in Generator. Wenn Sie mit den Anforderungen etwas genauer sein könnten, könnten wir vielleicht sogar noch besser machen.

Zum Beispiel haben Sie erwähnt, dass Sie verschiedene Funktionen ausführen. Warum nicht ersetzt es mit so etwas wie:

def clean_some_data(data, cleanup_functions): 
    return [cleanup_function(data) for cleanup_function in cleanup_functions] 

# or 

def clean_some_data(data, cleanup_functions): 
    for cleanup_function in cleanup_function: 
     data = [cleanup_function(item) for item in data] 
    return data 

gibt es einige Möglichkeiten, aber mehr Details würden

Verwandte Themen