[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction

J'ai senti qu'il serait possible de mesurer le temps d'exécution d'une fonction simplement en ajoutant un décorateur, alors j'ai essayé. (Je pense que c'est déjà dans le paquet)

Exemple d'implémentation

Comme j'utilise sobrement f-string, Python 3.6 ou supérieur est requis, mais je pense que 2.7 fonctionnera avec quelques modifications.

Définition d'un décorateur qui mesure le temps d'exécution d'une fonction


import time

def calc_time(message='', parser=None):
    def _calc_time(func):
        import functools

        @functools.wraps(func)
        def wrapper(*args, **kargs):
            start = time.time()
            ret = func(*args, **kargs)
            if parser:
                parsed_message = parser(message, *args, **kargs)
                print(
                    f'end time : {time.time() - start:0.4} sec : {parsed_message}')
            else:
                print(f'end time : {time.time() - start:0.4} sec : {message}')
            return ret
        return wrapper
    return _calc_time

Je pense qu'il y a des cas où je veux afficher un message qui utilise un argument de fonction, donc je permet de passer un objet fonction pour le traitement du message.

Exemple d'utilisation

test.py


import time


def message_parser(message, *args, **kargs):
    return f"{message} and {args[0]}"


def calc_time(message='', parser=None):
    def _calc_time(func):
        import functools

        @functools.wraps(func)
        def wrapper(*args, **kargs):
            start = time.time()
            ret = func(*args, **kargs)
            if parser:
                parsed_message = parser(message, *args, **kargs)
                print(
                    f'end time : {time.time() - start:0.4} sec : {parsed_message}')
            else:
                print(f'end time : {time.time() - start:0.4} sec : {message}')
            return ret
        return wrapper
    return _calc_time


@calc_time()
def test1():
    time.sleep(0.2)
    print('call test1')


@calc_time('something message')
def test2():
    time.sleep(0.2)
    print('call test2')


@calc_time('something message', parser=message_parser)
def test3(something_args):
    time.sleep(0.2)
    print('call test3')


@calc_time('something message',
           parser=lambda message, *args, **kargs: f"{message} and {args[0]}")
def test4(something_args):
    time.sleep(0.2)
    print('call test4')

@calc_time('something message',
           parser=lambda message, *args, **kargs: f"{message} and {kargs['something_args']}")
def test5(something_args):
    time.sleep(0.2)
    print('call test4')

@calc_time(parser=lambda message, *args, **kargs: f"{args[0]}")
def test6(something_args):
    time.sleep(0.2)
    print('call test4')

def main():
    test1()
    test2()
    test3('something args')
    test4('something args')
    test5(something_args='something args')
    test6('something args')

if __name__ == '__main__':
    main()

Exemple d'exécution


$ python test.py
call test1
end time : 0.2001 sec : 
call test2
end time : 0.2 sec : something message
call test3
end time : 0.2001 sec : something message and something args
call test4
end time : 0.2 sec : something message and something args
call test4
end time : 0.2 sec : something message and something args
call test4
end time : 0.2008 sec : something args

référence

À propos des décorateurs Python-Qiita [python] Utilisez functools.wrap () dans le décorateur --logging.info (self) [Python: Comment fabriquer et utiliser divers décorateurs et l'essence | CUBE SUGAR STORAGE](http://momijiame.tumblr.com/post/86112194941/python-%E8%89%B2%E3%80%85%E3% 81% AA% E3% 83% 87% E3% 82% B3% E3% 83% AC% E3% 83% BC% E3% 82% BF% E3% 81% AE% E4% BD% 9C% E3% 82% 8A% E6% 96% B9% E3% 81% A8% E4% BD% BF% E3% 81% 84% E6% 96% B9% E3% 81% 9D% E3% 81% 97% E3% 81% A6% E6% 9C% AC% E8% B3% AA)

Recommended Posts

[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
Mesurer le temps d'exécution de la fonction en Python
Une fonction qui mesure le temps de traitement d'une méthode en python
[Python] Une fonction simple pour trouver les coordonnées du centre d'un cercle
Temps d'exécution de la fonction (Python)
Récupérer l'appelant d'une fonction en Python
Comment mesurer le temps d'exécution avec Python Partie 1
Comment mesurer le temps d'exécution avec Python, partie 2
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
J'ai fait un outil pour estimer le temps d'exécution de cron (+ débuts de PyPI)
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
Un débutant en programmation a essayé de vérifier le temps d'exécution du tri, etc.
Note Python: Le mystère de l'attribution d'une variable à une variable
Comment tester unitaire une fonction contenant l'heure actuelle à l'aide de Freezegun en Python
Ajouter une fonction pour indiquer la météo d'aujourd'hui au bot slack (fabriqué par python)
Essayez d'obtenir la liste des fonctions du paquet Python> os
Mesurons le résultat de l'exécution du programme avec C ++, Java, Python.
[Python] Faire de la fonction une fonction lambda
Python (de la première fois à l'exécution)
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python (version non bloquante)
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
[Python 3.8 ~] Comment définir intelligemment des fonctions récursives avec des expressions lambda
Comment vérifier la taille de la mémoire d'une variable en Python
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Créez une fonction pour obtenir le contenu de la base de données dans Go
[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot
[Python] Un programme qui fait pivoter le contenu de la liste vers la gauche
Créer un décorateur de fonction Python avec Class
Mesurer la force de l'association dans un tableau croisé
[Python3] Réécrire l'objet code de la fonction
[python] [meta] Le type de python est-il un type?
L'histoire du traitement A du blackjack (python)
[Python] Explique comment utiliser la fonction range avec un exemple concret
[Python] Un programme qui calcule le nombre de chaussettes jumelées
Diverses méthodes pour créer numériquement la fonction inverse d'une certaine fonction Introduction
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
Comment créer un wrapper qui préserve la signature de la fonction à envelopper
[Introduction à Python] Comment écrire une chaîne de caractères avec la fonction format
Code Python pour déterminer les signaux mensuels pour les investissements de force relative
Obtenez une instance datetime à tout moment de la journée en Python
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
[Python] Note: Fonction auto-conçue pour trouver la zone de distribution normale
Décorateur de fonction Python
Comment calculer la volatilité d'une marque
Dessiner un graphique d'une fonction quadratique en Python
Préparer l'environnement d'exécution de Python3 avec Docker
Paramètre pour afficher le journal de l'exécution de cron
Copiez la liste en Python
Une manière intelligente de chronométrer le traitement avec Python
Écrire une note sur la version python de python virtualenv
[Python] Une compréhension approximative du module de journalisation
Sortie sous la forme d'un tableau python
Au moment de la mise à jour de python avec ubuntu
amateur python tente de résumer la liste ②