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 dsy . É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 arnaudus . É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 lolop (site web personnel) . É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
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.