[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst

Ich hatte das Gefühl, dass es möglich sein würde, die Ausführungszeit einer Funktion durch Hinzufügen eines Dekorateurs zu messen, also habe ich es versucht. (Ich denke es ist schon im Paket)

Implementierungsbeispiel

Da ich F-String nüchtern verwende, ist Python 3.6 oder höher erforderlich, aber ich denke, dass 2.7 mit einigen Modifikationen funktioniert.

Definition eines Dekorateurs, der die Ausführungszeit einer Funktion misst


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

Ich denke, es gibt Fälle, in denen ich eine Nachricht anzeigen möchte, die ein Funktionsargument verwendet. Daher mache ich es möglich, ein Funktionsobjekt für die Nachrichtenverarbeitung zu übergeben.

Anwendungsbeispiel

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()

Ausführungsbeispiel


$ 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

Referenz

Über Python Decorators-Qiita [Python] Verwenden Sie functools.wrap () im Dekorator --logging.info (self) [Python: Erstellen und Verwenden verschiedener Dekoratoren und die Essenz | 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] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Messen Sie die Ausführungszeit von Funktionen in Python
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
[Python] Eine einfache Funktion zum Ermitteln der Mittelkoordinaten eines Kreises
Funktionsausführungszeit (Python)
Holen Sie sich den Aufrufer einer Funktion in Python
So messen Sie die Ausführungszeit mit Python Teil 1
So messen Sie die Ausführungszeit mit Python Part 2
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
Ich habe ein Tool erstellt, um die Ausführungszeit von cron zu schätzen (+ PyPI-Debüt)
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
Ein Programmieranfänger versuchte, die Ausführungszeit des Sortierens usw. zu überprüfen.
Python Hinweis: Das Rätsel, einer Variablen eine Variable zuzuweisen
So testen Sie eine Funktion, die die aktuelle Zeit enthält, mit Freezegun in Python
Fügen Sie eine Funktion hinzu, um dem Wetter heute mitzuteilen, dass der Bot locker ist (hergestellt von Python).
Versuchen Sie, die Funktionsliste des Python> os-Pakets abzurufen
Lassen Sie uns das Ausführungsergebnis des Programms mit C ++, Java, Python messen.
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
Python (vom ersten Mal bis zur Ausführung)
Ich habe eine Funktion zum Trimmen des Bildes von Python openCV erstellt. Verwenden Sie sie daher bitte.
Übergeben des Ausführungsergebnisses eines Shell-Befehls in einer Liste in Python (nicht blockierende Version)
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
[Python 3.8 ~] Wie man rekursive Funktionen mit Lambda-Ausdrücken intelligent definiert
So überprüfen Sie die Speichergröße einer Variablen in Python
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
[Python] Ein Programm, das den Inhalt der Liste nach links dreht
Erstellen Sie mit Class einen Python-Funktionsdekorator
Messen Sie die Assoziationsstärke in einer Kreuztabelle
[Python3] Schreiben Sie das Codeobjekt der Funktion neu
[Python] [Meta] Ist der Python-Typ ein Typ?
Die Geschichte der Verarbeitung A von Blackjack (Python)
[Python] Erklärt anhand eines konkreten Beispiels, wie die Bereichsfunktion verwendet wird
[Python] Ein Programm, das die Anzahl der gepaarten Socken berechnet
Verschiedene Methoden zum numerischen Erstellen der Umkehrfunktion einer bestimmten Funktion Einführung
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
[Einführung in Python] So schreiben Sie eine Zeichenfolge mit der Formatierungsfunktion
Python-Code zur Bestimmung der monatlichen Signale für Investitionen mit relativer Stärke
Holen Sie sich zu jeder Tageszeit eine Datums- / Uhrzeitinstanz in Python
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
[Python] Hinweis: Selbst erstellte Funktion zum Ermitteln des Bereichs der Normalverteilung
Python-Funktionsdekorateur
So berechnen Sie die Volatilität einer Marke
Zeichnen Sie in Python ein Diagramm einer quadratischen Funktion
Bereiten Sie die Ausführungsumgebung von Python3 mit Docker vor
Einstellung zur Ausgabe des Protokolls zur Ausführung von cron
Kopieren Sie die Liste in Python
Eine clevere Möglichkeit zur Zeitverarbeitung mit Python
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
[Python] Ein grobes Verständnis des Protokollierungsmoduls
Ausgabe in Form eines Python-Arrays
Zum Zeitpunkt des Python-Updates mit Ubuntu
Python Amateur versucht die Liste zusammenzufassen ②