Forum Programmation.python Coût de l’introspection

Posté par . Licence CC by-sa.
2
28
mai
2018

Bonjour à tous,

J’ai une fonction qui se charge d’écrire des messages dans un fichier (les logs de mon application). Cette fonction peut être utilisée par différents objets. Donc pour avoir le maximum d’information dans mes logs, cette fonction fait appel à la fonction currentframe() du module inspect :

from inspect import currentframe
class Logger:
    """Log messages."""
    def __init__(self):
        self.logfile  = sys.stderr
        self.log_time = False

    def __del__(self): self.logfile.close()

    def log(self, message, level = 0, f = None):
        """Write a message to the logger’s output if its criticity is over the chosen level."""
        prefix = ''
        info = '[{}|{}]'.format(str(level),str(currentframe().f_back.f_locals['self']))
        if self.log_time: prefix = '{} {:12s} '.format(strftime("%Y-%m-%d %H:%M:%S"),info)
        if level >= self.level:
            if f: print(prefix+str(message), file=f)
            else: print(prefix+str(message), file=self.logfile)
        self.flush()

J’appelle donc inspectcurrentframe().f_back.f_locals['self'] à chaque fois que j’écris un message dans les log…

L’objet qui appelle a sa fonction __str()__ définie ainsi :

    def __str__(self):
        return self.name

comme ça j’ai le nom de l’objet concerné pour chaque ligne de log, sans avoir à passer par un argument à chaque fois.

L’import du module inspect et cet appel à currentframe() ont forcément un coût mais j’ai du mal à l’évaluer ou à trouver des informations sur le sujet… Est-ce selon vous un luxe dont je devrais absolument me passer ou bien ce serait de l’optimisation précoce et malvenue de ce soucier de ça au début d’un projet ?

Je peux bien sûr mettre une option pour ça, mais la question devient alors : quel choix par défaut pour cette option ? :)

Là il s’agit seulement d’avoir des logs plus parlant… mais au delà de ce cas précis… la question qui je me pose est la suivante : puis-je me reposer sur le module inspect sur un plan fonctionnel, ou bien est-ce une mauvaise idée ?

  • # Profiler

    Posté par . Évalué à 4.

    Salut, pourquoi ne pas évaluer par toi-même le coût CPU ?
    Un profiler comme Yappi, par exemple, devrait te fournir des mesures.

    • [^] # Re: Profiler

      Posté par . Évalué à 4.

      Je n'ai pas d'expérience avec Python, mais dans tous les langages que je connais, les entrées/sorties sont infiniment plus coûteuses que tout appel de fonction quel que soit le contexte. J'aurais tendance à partir du principe par défaut que le coût du log est dominé par le print, quitte à revenir sur ce principe si en effet à l'exécution il semble y avoir un problème.

      Par contre, de manière générale, rendre le log optionnel est une bonne idée.

      • [^] # Re: Profiler

        Posté par (page perso) . Évalué à 3.

        Si tu ne veux pas avoir des gros fichiers de logs dont seule la fin t'intéresse et ne pas perdre le temps d'enregistrement, tu peux regarder le module bbrecorder que j'ai écrit il y a quelques temps:

        https://perso.limsi.fr/pointal/dev:bbrecorder

        Python 3 - Apprendre à programmer en Python avec PyZo et Jupyter Notebook → https://www.dunod.com/sciences-techniques/python-3

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.