Question

Toutes mes excuses pour le repostage, mais j’ai dû modifier cette question lorsque je me suis mis au travail et j’ai réalisé que j’avais besoin d’un compte pour le faire. Alors ça recommence (avec un peu plus de contexte).

J'essaie de chronométrer le temps d'exécution d'un script et je pense le faire en vérifiant le temps écoulé après l'exécution de chaque ligne de code. Je l'ai déjà fait lorsque le script contient des définitions de méthode, mais je ne sais pas comment cela fonctionnerait dans cet exemple.

Ma question est donc la suivante: existe-t-il un moyen d’utiliser la fonction setTrace () dans un script qui n’a pas de définition de méthode? c'est-à-dire

for i in range(1, 100):
    print i

def traceit(frame, event, arg):
    if event == "line":
        lineno = frame.f_lineno
        print "line", lineno

    return traceit

sys.settrace(traceit)
Était-ce utile?

La solution

Non, comme la documentation , par exemple, "La fonction de trace est appelée (avec l'événement défini sur" call ") à chaque fois qu'une nouvelle portée locale est entrée" - si vous n'entrez jamais une étendue locale (et n'exécutez que dans une étendue globale), la fonction de trace ne sera jamais appelée. Notez que settrace est de toute façon trop invasif pour chronométrer "le temps nécessaire à l'exécution d'un script". car cela modifierait ce qu'il mesure trop; si ce que vous dites est réellement ce que vous voulez, prenez simplement le temps au début de l’exécution et enregistrez avec atexit une fonction qui récupère le temps et affiche la différence. Si ce que vous voulez est différent, par exemple, profiling , consultez cProfile .

Veuillez noter que l’exemple de code que vous avez donné n’aurait aucune utilité (même si je l’ai modifié pour corriger une erreur d’indentation): d’abord, il boucle, puis une fonction est définie, enfin elle appelle settrace ... puis se termine immédiatement car il n'y a plus de code après ça! Si vous souhaitez que quelque chose se produise avant ce début de boucle et que vous souhaitiez tout avoir au premier niveau du module (mauvaise idée, mais peu importe), vous devez mettre le mot "n'importe quoi". lexicalement avant la boucle, pas après ...; -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top