2010-12-11 4 views
5

J'avais besoin de vérifier les statistiques de mémoire des objets que j'utilise en python.
Je suis tombé sur guppy et pysizer, mais ils ne sont pas disponibles pour python2.7.
Existe-t-il un profileur de mémoire disponible pour python 2.7?
Si ce n'est pas le cas, je peux le faire moi-même?Existe-t-il un profileur de mémoire pour python2.7?

+0

Avez-vous * vraiment * besoin de profiler votre code? Je ne faisais que demander! – user225312

+0

"vérifier les statistiques de la mémoire des objets" Pourquoi? Quel problème ** spécifique ** avez-vous? Mémoire insuffisante? Le profilage n'est généralement pas nécessaire, c'est généralement * évident * quel objet est trop grand. Veuillez expliquer quel problème vous observez réellement. –

+2

duplication possible de [profileur de mémoire Python] (http://stackoverflow.com/questions/110259/python-memory-profiler) –

Répondre

2

Vous pouvez essayer d'adapter le code suivant votre situation spécifique et soutenir vos types de données:

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

Cela semble prometteur, mais je pense que vous devriez le changer en 'def getsizeof (obj, memo = None):' et déplacer l'initialisation de 'memo' dans la fonction avec comme' si memo est None: memo = set() '. Bien sûr, tous les appels récursifs à 'getsizeof()' devraient alors avoir leurs arguments échangés aussi. – martineau

+1

@martineau: Une promesse qui ne devrait pas être négligemment lancée sur le chemin d'un débutant. Gérer des instances de classes à travers toutes les complexités de l'ancien/nouveau, avec/sans '__slots__', l'héritage non/simple/multiple, etc. est un cauchemar. Voir par exemple http://code.activestate.com/recipes/546530-size-of-python-objects-revised/ qui a pris bien au-dessus de 2000 SLOC et de multiples versions pour l'obtenir à un non-connu-à-être-faux Etat. Je suis d'accord avec votre commentaire sur l'argument 'memo'. –

+0

@John Machin: La recette activestate est maintenant plus proche de 3000 lignes de code source et est la version 5.12, donc le cas général est apparemment un œuf très dur à cracker - ce qui est une des raisons pour lesquelles j'ai trouvé la réponse de @Noctis Skytower n'a pas besoin d'un outil qui gère tous les cas imaginables, juste quelques-uns des leurs. Espérons que 'sys.getsizeof() 'va s'améliorer dans le futur - je n'en ai jamais vraiment eu besoin pour quoi que ce soit, je n'étais donc au courant que de l'avoir été ajouté, et pas de toutes ses lacunes. – martineau

1

Je ne connais aucun profileur pour Python 2.7 - mais vérifiez la fonction suivante qui a été ajoutée au module sys, cela pourrait vous aider à le faire vous-même.

« Une nouvelle fonction, getsizeof(), prend une objet python et renvoie la quantité de mémoire utilisée par l'objet, mesurée en octets objets intégrés en retour résultats corrects;. Tiers extensions peuvent non, mais peut définir une méthode __sizeof__() pour renvoyer la taille de l'objet. "

est ici des liens vers des endroits dans la documentation en ligne avec des informations à ce sujet:

        What’s New in Python 2.6
        27.1. sys module — System-specific parameters and functions

+0

Il pourrait mais ce n'est pas le cas. 'sys.getsizeof' est" un piège et une illusion ". Lisez cette question SO, en particulier la réponse de Thomas Wouters: http://stackoverflow.com/questions/2117255 –

+0

@John Machin: Dans ce cas, que pensez-vous de la réponse de @Noctis Skytower? – martineau

Questions connexes