Avevo bisogno di controllare le statistiche di memoria degli oggetti che uso in python.
Mi sono imbattuto in guppy e pysizer, ma non sono disponibili per python2.7.
È disponibile un profiler di memoria per python 2.7?
Se non c'è un modo in cui posso farlo da solo?Esiste un profiler di memoria per python2.7?
risposta
Si potrebbe desiderare di provare adattare il seguente codice la tua situazione specifica e supporta i tuoi tipi di dati:
import sys
def sizeof(variable):
def _sizeof(obj, memo):
address = id(obj)
if address in memo:
return 0
memo.add(address)
total = sys.getsizeof(obj)
if obj is None:
pass
elif isinstance(obj, (int, float, complex)):
pass
elif isinstance(obj, (list, tuple, range)):
if isinstance(obj, (list, tuple)):
total += sum(_sizeof(item, memo) for item in obj)
elif isinstance(obj, str):
pass
elif isinstance(obj, (bytes, bytearray, memoryview)):
if isinstance(obj, memoryview):
total += _sizeof(obj.obj, memo)
elif isinstance(obj, (set, frozenset)):
total += sum(_sizeof(item, memo) for item in obj)
elif isinstance(obj, dict):
total += sum(_sizeof(key, memo) + _sizeof(value, memo)
for key, value in obj.items())
elif hasattr(obj, '__slots__'):
for name in obj.__slots__:
total += _sizeof(getattr(obj, name, obj), memo)
elif hasattr(obj, '__dict__'):
total += _sizeof(obj.__dict__, memo)
else:
raise TypeError('could not get size of {!r}'.format(obj))
return total
return _sizeof(variable, set())
Sembra promettente, ma penso che dovresti cambiarlo in 'def getsizeof (obj, memo = None):' e spostare l'inizializzazione di 'memo' all'interno della funzione con come' se memo è None: memo = set() '. Ovviamente tutte le chiamate ricorsive a 'getsizeof()' avrebbero bisogno di scambiare anche i loro argomenti. – martineau
@martineau: una promessa che non dovrebbe essere casualmente gettata nel percorso di un principiante. Gestire istanze di classi attraverso tutte le complessità di vecchio/nuovo, con/senza '__slots__', no/single/multiple ereditarietà, ecc. È un incubo. Vedi ad esempio http://code.activestate.com/recipes/546530-size-of-python-objects-revised/ che ha avuto ben oltre 2000 SLOC e più versioni per arrivare a un non noto-to-be-wrong stato. Sono d'accordo con il tuo commento sul 'memo' arg. –
@John Machin: La ricetta activestate è ora più vicina a 3000 linee di codice sorgente ed è la versione 5.12, quindi il caso generale è apparentemente un uovo molto difficile da decifrare - che è una ragione per cui ho trovato la risposta di @Noctis Skytower interessante perché spesso non ha bisogno di uno strumento che gestisca ogni caso immaginabile, solo alcuni di loro. Spero che sys.getsizeof() 'migliorerà in futuro - non ho mai realmente avuto bisogno di nulla, quindi ero solo consapevole del fatto che non è stato aggiunto, e non di tutte le sue carenze. – martineau
Non sono a conoscenza di alcun profiler per Python 2.7 - ma controlla la seguente funzione che è stata aggiunta al modulo sys
, potrebbe aiutarti a farlo da solo.
"Una nuova funzione,
getsizeof()
, prende un pitone oggetto e restituisce la quantità di memoria utilizzata dall'oggetto, misurata in byte incorporato oggetti restituiscono risultati corretti;. Terzi estensioni possono no, ma può definire un metodo__sizeof__()
per restituire la dimensione dell'oggetto. "
Ecco i link ai posti nella documentazione on-line con informazioni su di esso:
What’s New in Python 2.6
27.1. sys module — System-specific parameters and functions
Potrebbe ma non è così. 'sys.getsizeof' è" una trappola e un'illusione ". Leggi questa domanda SO, in particolare la risposta di Thomas Wouters: http://stackoverflow.com/questions/2117255 –
@John Machin: In tal caso, cosa ne pensi della risposta di @Noctis Skytower? – martineau
Ecco uno che funziona per Python 2.7: The Pympler package.
Hai * veramente * bisogno di profilare il tuo codice? Solo per chiedere! – user225312
"controlla le statistiche di memoria degli oggetti" Perché? Che problema ** specifico ** stai avendo? Fuori dalla memoria? Generalmente il profiling non è necessario, di solito è * ovvio * quale oggetto è troppo grande. Per favore, spiega quale problema stai effettivamente osservando. –
possibile duplicato di [Profiler di memoria Python] (http://stackoverflow.com/questions/110259/python-memory-profiler) –