Un décorateur que les profils d'un appel de méthode et enregistre le résultat de profilage
Je veux créer un décorateur que les profils d'une méthode et enregistre le résultat. Comment cela peut-il être fait?
Qu'entendez-vous par "profils"? Calendrier? Ou de la recherche de code pour l'optimiser? Si ce dernier, essayez ceci.
OriginalL'auteur Weholt | 2011-03-21
Vous devez vous connecter pour publier un commentaire.
Le décorateur ressemblerait à quelque chose comme:
De toute façon, si vous voulez faire un peu de sérieux profilage je vous suggère d'utiliser le profil ou cProfile paquets.
Sans doute l'importation de temps, pas de timeit.
OriginalL'auteur
Si vous voulez bon profilage au lieu de calendrier, vous pouvez utiliser une fonction non documentée de
cProfile
(à partir de cette question):Si vous voulez plus de contrôle sur le nom de fichier, puis vous aurez besoin d'une autre couche d'indirection:
Il semble compliqué, mais si vous le suivez, étape par étape (et notez la différence, en invoquant le profiler), il devrait être clair.
c'est juste une hypothétique fonction qui prend le nom de la fonction et la transforme en un nom de fichier, par exemple.
func.__name__ + .profile
. Il n'a pas à être quoi que ce soit.Vous pourriez faire cela plus clair, comme l'appel d'une méthode en dehors de la portée que pourrait être n'importe quoi et ce n'est pas encore clair que sa va être un nom de fichier jusqu'à ce que vous savez vraiment ce que sa fait! Mettre une chaîne ou d'un commentaire expliquant serait beaucoup plus utile!
Comment avez-vous lu les
.profile
fichier? Il ne semble pas y avoir de texte.L'canonique des moyens de visualisation de fichiers de profil comme de 2016 est SnakeViz le Python 3-compatible successeur de RunSnakeRun. (Vous savez... just sayin'.)
OriginalL'auteur
Ici est un décorateur avec deux paramètres, le profil de sortie du fichier et le nom du champ pour trier les résultats. La valeur par défaut est le temps cumulé, ce qui est utile pour trouver les goulots d'étranglement.
OriginalL'auteur
Si vous avez compris comment écrire un décorateur pour cProfile, pensez à utiliser functools.enveloppements.
Ajoute simplement une ligne peut vous aider à débogage décorateurs beaucoup plus facile. Sans l'utilisation de functools.enveloppements, le nom de l'décoré de la fonction aurait été "emballé", et la docstring de auraient été perdus.
Donc la version améliorée serait
OriginalL'auteur
J'aime la réponse de @detly. Mais parfois, c'est un problème pour une utilisation SnakeViz pour afficher le résultat.
J'ai fait une version légèrement différente qui écrit le résultat sous forme de texte dans le même fichier:
J'espère que cela aide quelqu'un...
OriginalL'auteur