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.
- 1. Esiste un go profiler?
- 2. Profiler frammentazione memoria
- 3. C'è un profiler della memoria di lavoro per Python3
- 4. Esiste un profiler gratuito e di buon livello per PHP?
- 5. Esiste un "profiler della dimensione della funzione"?
- 6. Utilizzo di VS2010 Profiler per la misurazione della memoria
- 7. Esiste un equivalente PostgreSQL del profiler di SQL Server?
- 8. ANTS Memory Profiler - Quale memoria dovrei guardare?
- 9. Esiste un modo per limitare CPU/memoria di un processo?
- 10. Esiste un appender di memoria log4net?
- 11. Esiste un limite di memoria per il browser Google Chrome?
- 12. python2.7 peek at stdin
- 13. Graphing Profiler per Java?
- 14. Profiler per Sql CE
- 15. NYTProf Profiler per Perl
- 16. Come installo mysql-python per python2.7
- 17. GAE + Python2.7 + webapp2 + AJAX
- 18. Applicazione Tomcat Profiler per Eclipse indigo
- 19. Scala profiler?
- 20. Esiste un provider in memoria per Entity Framework?
- 21. Esiste un modo in SQL profiler per filtrare in base alle istruzioni INSERT?
- 22. Buono profiler C++ per GCC
- 23. GoLang - Esiste un modo per profilare l'utilizzo della memoria del codice che utilizza reflect?
- 24. come funziona un C# profiler?
- 25. C'è un modo per filtrare una traccia di SQL Profiler?
- 26. Profilo di memoria per C
- 27. python2.7: configurazione di registrazione con yaml
- 28. Flash Builder 4 Profiler: come individuare quali oggetti causano un aumento di memoria noto?
- 29. foglio di stile "profiler"
- 30. Come installare gtk in python2.7?
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) –