2010-12-11 17 views
5

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?

+0

Hai * veramente * bisogno di profilare il tuo codice? Solo per chiedere! – user225312

+0

"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. –

+2

possibile duplicato di [Profiler di memoria Python] (http://stackoverflow.com/questions/110259/python-memory-profiler) –

risposta

2

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()) 
+0

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

+1

@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. –

+0

@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

1

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

+0

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 –

+0

@John Machin: In tal caso, cosa ne pensi della risposta di @Noctis Skytower? – martineau