Python Decorators for Mathematical Operations: Examples and Use Cases
This article introduces Python decorators tailored for mathematical functions, presenting four practical examples—a timing decorator, a simple automatic differentiation decorator, a result‑caching decorator, and a random‑noise decorator—each accompanied by complete code snippets and explanations.
In Python, decorators are powerful tools that can modify or enhance the behavior of functions or classes without changing their source code; this article focuses on decorators designed for mathematical operations, offering concise examples that illustrate performance measurement, automatic differentiation, result caching, and noise injection.
1. Execution‑time measuring decorator – This decorator measures and prints the execution time of any mathematical function, aiding performance analysis.
import time
def timing_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} took {end_time - start_time:.4f} seconds")
return result
return wrapper
@timing_decorator
def fibonacci(n):
if n <= 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
fibonacci(10)2. Simple automatic‑differentiation decorator – Provides a minimal example for computing a first‑order derivative of a function; for complex cases, libraries like SymPy are recommended.
def derivative_decorator(func):
def wrapper(x, dx=0.0001):
return (func(x + dx) - func(x)) / dx
return wrapper
@derivative_decorator
def square(x):
return x**2
print(square.derivative(3)) # approximate derivative at x=33. Result‑caching decorator for pure functions – Uses functools.lru_cache to cache results of pure mathematical functions, avoiding redundant calculations and improving efficiency.
from functools import lru_cache
@lru_cache(maxsize=None)
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
print(factorial(100)) # compute large factorial with caching4. Random‑noise decorator – Adds Gaussian noise to the output of a mathematical function, simulating measurement error or uncertainty.
import random
def add_noise_decorator(std_dev):
def decorator(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result + random.gauss(0, std_dev)
return wrapper
return decorator
@add_noise_decorator(std_dev=0.1)
def sine(x):
import math
return math.sin(x)
print(sine(math.pi/2)) # sin(π/2) with random noiseTest Development Learning Exchange
Test Development Learning Exchange
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.