67. Decorators for Timing Functions
Decorators for Timing Functions: Measuring Execution Time
A decorator in Python is a function that wraps another function to modify its behavior. One useful application of decorators is to measure the execution time of functions. This can be useful for performance monitoring or profiling. Below is an example of how to create a decorator that measures the execution time of a function.
1. Basic Timing Decorator
This decorator will measure the time it takes for a function to execute and print the result.
import time
# Timing decorator
def timing_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time() # Record start time
result = func(*args, **kwargs)
end_time = time.time() # Record end time
print(f"Execution time of {func.__name__}: {end_time - start_time:.4f} seconds")
return result
return wrapper
# Example function to measure
@timing_decorator
def slow_function():
time.sleep(2) # Simulating a time-consuming operation
return "Done"
# Call the function
slow_function()Output:
2. Decorator with Arguments
If you want to add functionality like logging the time for a list of functions or conditional execution, you can add parameters to the decorator.
Output:
3. Timing Decorator for Multiple Functions
You can use a decorator to time multiple functions without repeating the timing logic.
Output:
4. Using functools.wraps for Preserving Function Metadata
When using decorators, the metadata of the wrapped function (like its name and docstring) may be lost. To avoid this, use functools.wraps() to preserve the original function's attributes.
Output:
5. Decorator for Asynchronous Functions
If your function is asynchronous, you can also use a timing decorator with asyncio.
Output:
6. Using Time in Nanoseconds
To measure the execution time with more precision, you can use time.perf_counter() which provides a higher-resolution timer.
Output:
7. Timing Function with Return Value
The decorator can also return the function’s result after logging the execution time.
Output:
8. Using Timing Decorators with Function Arguments
You can also pass arguments into the decorator, like logging the time for specific types of functions.
Output:
9. Decorator for Profiling Multiple Functions
Use the decorator for profiling multiple functions in your code.
Output:
10. Combining Multiple Decorators
You can combine timing decorators with other decorators, for example, logging.
Output:
By using decorators to measure execution time, you can efficiently monitor the performance of your functions, especially when working with time-consuming tasks. The decorator pattern is a powerful tool in Python, and this technique helps keep the code clean and reusable.
Last updated