在Python中调用函数的次数

rai*_*man 5 python

假设我想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评估积分.

use*_*ica 7

当然.使用呼叫计数包装器:

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_callsf定义中使用装饰器(尽管你可以将它用作装饰器),以便更容易采取单独的计数.使用全局或使用它作为装饰器,您必须记住每次手动重置计数器.

  • @LeonardoHerrera:的确,我有一些错误.`@ functools.wraps(f)`行上还有一个额外的冒号. (2认同)

Joe*_*don 4

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)