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)
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.
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
Ü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