Estou depurando um código. Eu tenho um código com muitas linhas em python 2. E algumas funções são executadas por muito tempo. Para verificar uma função concluída com êxito, estou fazendo o seguinte:
print("creating an object... "), # a comma here to print a subsequent print in one line
obj = TimeDemandingFunction()
print("end")
Existe um melhor método para registrar?
PS, a função TimeDemandingFunction()
é de uma biblioteca externa .
A resposta de Baduker me levou a dar uma versão modificada de sua resposta. Vou resumir e dar vários exemplos. A construção de um decorador é semelhante ao Baduker, mas com várias modificações: (1) há uma notificação de que uma função foi iniciada com a informação de onde foi chamada (número de linha e quais teclas são usadas), (2) ele escreve informações sobre o tempo apenas no final. Abaixo, dou exemplos de como usá-lo para funções externas:
import functools
import timeit
import sys
def my_custom_timer(func):
@functools.wraps(func)
def wrapper_timer(*args, **kwargs):
start_time = timeit.default_timer()
s = ''
for arg_name in kwargs:
s += arg_name + '; line=' + str(sys._getframe().f_back.f_lineno)
print("Started {!r}({!r}) ".format(func.__name__, s)),
value = func(*args, **kwargs)
end_time = timeit.default_timer()
run_time = end_time - start_time
print("Finished in {:.4f} seconds.".format(run_time))
return value
return wrapper_timer
Então vai uma parte interessante. Primeiro, você precisa descobrir todo o caminho para a função. Use a ideia aqui . Resumidamente, as funções têm um atributo de módulo :
>>> from math import sqrt
>>> sqrt.__module__
'math'
Primeiro, vamos redefinir a sqrt
função de algum módulo:
import math
@my_custom_timer
def sqrt(*args, **kwargs):
return math.sqrt(*args, **kwargs)
E se uma função de um módulo embutido ?! Sem problemas. A resposta é __builtin__
módulo:
>>> print(divmod.__module__)
'__builtin__'
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras