假设我想x**2从0到1 进行整合.我使用以下方法进行scipy.integrate.quad:
from scipy import integrate
def f(x): return x**2
I = integrate.quad(f, 0, 1)[0]
print(I)
Run Code Online (Sandbox Code Playgroud)
问题:有没有办法知道用户定义的函数f被调用多少次quad?我想这样做,因为我有兴趣知道有多少用于quad评估积分.
当然.使用呼叫计数包装器:
import functools
def counted_calls(f):
@functools.wraps(f)
def count_wrapper(*args, **kwargs):
count_wrapper.count += 1
return f(*args, **kwargs)
count_wrapper.count = 0
return count_wrapper
Run Code Online (Sandbox Code Playgroud)
并将包装版本传递给quad:
wrapped = counted_calls(f)
integrate.quad(wrapped, 0, 1)
print(wrapped.count)
Run Code Online (Sandbox Code Playgroud)
演示,通话次数为21.
我特别避免使用全局计数器或counted_calls在f定义中使用装饰器(尽管你可以将它用作装饰器),以便更容易采取单独的计数.使用全局或使用它作为装饰器,您必须记住每次手动重置计数器.
f只要在调用时添加到全局即可:
from scipy import integrate
count = 0
def f(x):
global count
count += 1
return x ** 2
I = integrate.quad(f, 0, 1)[0]
print(I)
print('called', count, 'times')
Run Code Online (Sandbox Code Playgroud)