Python get the total execution time of a function

Question:

Suppose that I have a function:

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

It will be called in every place when needed, for example, func_a in class A, func_b in class B… And all the modules start from a main function, main().

Now I want to statistic the amount of the called freqs and time of func. It’s similar to profiler, but I only want to get the statistics of func; I do not care about other methods.

A Decorator can only get the time once, which is not sufficient for the total time. Another problem is that func overrides a function in another package. It may be called by functions in the package, and it is not easy to add a decorator to every call method.

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

Is there any simple method that I can use to get the total execution of func with the minimum code?

Asked By: Whisht

||

Answers:

If you simply want to have the total execution time printed next to the execution time of the current call, you can store the total execution time as a local variable in the decorator and add to it the execution time of each call:

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

Demo: Try it online!

Or if you want to be able to access the total execution time separately, you can expose it as an additional attribute of the wrapper function object:

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

so that:

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

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

outputs:

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

Demo: Try it online!

Answered By: blhsing
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.