Python获取函数总执行时间

问题描述 投票:0回答:1

假设我有一个函数:

def func(x):
    time.sleep(x)
    return x

在每个需要的地方都会调用它,例如

func_a in class A
func_b in class B
...并且所有模块都从一个主函数开始,
main()

现在我想统计

func
的被叫频率和时间。和
profiler
类似,但是我只想得到
func
的统计数据;我不关心其他方法。

一个Decorator只能获取一次时间,这对于总时间来说是不够的。另一个问题是

func
覆盖了另一个包中的函数。可能会被包中的函数调用,给每个调用方法都添加一个装饰器并不容易

def time(func):
    def wrapper(*args, **kwargs):
         import time
         st = time.time()
         result = func(*args, **kwargs)
         end = time.time()
         print(f"execution time: {end - st}")
         return result
     return wrapper()
@time
def func(x):
    ...

有没有什么简单的方法可以用最少的代码获得

func
的总执行量?

python decorator profiler
1个回答
0
投票

如果您只想在当前调用的执行时间旁边打印总执行时间,您可以将总执行时间存储在装饰器中的局部变量中,并将当前调用的执行时间添加到其中:

import time

def timer(func):
    def wrapper(*args, **kwargs):
        nonlocal total
        start = time.time()
        result = func(*args, **kwargs)
        duration = time.time() - start
        total += duration
        print(f"Execution time: {duration}   Total: {total}")
        return result

    total = 0
    return wrapper

演示:在线试用!

或者,如果您希望能够单独访问总执行时间,您可以将其公开为装饰器函数对象的附加属性:

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        duration = time.time() - start
        wrapper.total_time += duration
        print(f"Execution time: {duration}")
        return result

    wrapper.total_time = 0
    return wrapper

这样:

@timer
def func(x):
    time.sleep(x)
    return x

print(func(1))
print(func(2))
print(f'Total: {func.total_time}')

输出:

Execution time: 1.00111985206604
1
Execution time: 2.0005435943603516
2
Total: 3.0016634464263916

演示:在线试用!

© www.soinside.com 2019 - 2024. All rights reserved.