使用装饰器记录执行时间

2024-03-29 08:06:59 发布

您现在位置:Python中文网/ 问答频道 /正文

在我尝试了一段时间没有成功之后,我正在这个神奇的网站寻求帮助。现在我的问题是:我想创建一个decorator,它将函数的执行时间(在函数执行期间)写入日志文件,如:

@log_time("log.txt", 35)
def some_function(...):
    ...
    return result

以及

^{pr2}$

所以log.txt看起来像

Time elapsed: 0h 0m 35s
Time elapsed: 0h 1m 10s
Time elapsed: 0h 1m 45s

有什么想法吗?在


Tags: 文件函数txtlogreturntime网站def
3条回答

很快就组装好了,但在测试中使用了@timeit对几个函数进行了测试。在

import logging
logging.basicConfig(
    level=logging.DEBUG, 
    filename='myProgramLog.txt', 
    format=' %(asctime)s - %(levelname)s - %(message)s')

import time                                                

def timeit(method):

    def timed(*args, **kw):
        ts = time.time()
        result = method(*args, **kw)
        te = time.time()

        logging.debug('%r (%r, %r) %2.2f sec' % \
              (method.__name__, args, kw, te-ts))
        return result

    return timed

来源:https://www.andreas-jung.com/contents/a-python-decorator-for-measuring-the-execution-time-of-methodshttps://automatetheboringstuff.com/chapter10/

编辑:我发现Python附带了一个非常好的日志模块;为什么要重新发明轮子?在

我将给你一个基本的概述,你必须做什么来完成这一点。下面是一个接受两个参数并执行函数的decorator。缺少的功能以注释形式显示,请将其添加到:

def log_time(path_to_logfile, interval):
    def log(func):
        # 'wrap' this puppy up if needed 
        def wrapped(*args, **kwargs):
            # start timing
            func(*args, **kwargs)
            # stop timing
            with open(path_to_logfile, 'a') as f:
                pass # functionality
        return wrapped
    return log

现在可以修饰函数,输出将用path_to_logfile编写。例如,在这里装饰foo

^{pr2}$

将接受foo并执行它。您需要time并将内容写入文件。您应该更多地尝试使用装饰器,并阅读它们,一篇关于Decorators exist at the Python Wiki的好文章。在

好吧,我最后用线解决了一些问题。谢谢你的建议!在

import codecs, threading, time
from functools import wraps

def log_time(logpath="log.txt", interval=5):

    def log_time_decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            t = threading.Thread(target=func, args=args, kwargs=kwargs)
            log_entries = 0
            with codecs.open(logpath, "wb", "utf-8") as logfile:
               start_time = time.time()
               t.start()
               while t.is_alive():
                   elapsed_time = (time.time() - start_time)
                   if elapsed_time > interval * log_entries:
                       m, s = divmod(elapsed_time, 60)
                       h, m = divmod(m, 60)
                       logfile.write("Elapsed time: %2dh %2dm %2ds\n" %(h, m, s))
                       log_entries += 1
        return wrapper
    return log_time_decorator

一个缺点可能是您无法轻松地检索函数的返回值(至少我还没有找到它)。在

EDIT1:删除了一个不必要的变量,并为日志写入添加了一个很好的格式(参见this

EDIT2:即使其他用户拒绝了他的编辑,我还是希望包含一个来自Piotr Dabkowski的版本,因为它使用返回值:

^{pr2}$

相关问题 更多 >