Python统计函数调用次数的5种实现方式
本文详细介绍在Python中统计函数调用次数的多种方法。重点解析基于装饰器的两种实现,包括处理类方法的技巧,并补充三种无需装饰器的轻量级方案,如全局变量、实例属性及类属性计数,帮助开发者根据场景选择最优解。
一、前言
在执行搜索任务或分析时间复杂度的场景中,往往需要统计特定函数的调用频次。常规做法是在函数内部定义计数器变量,每次执行时递增,但这并非最高效的方案。本文将探讨更优雅的替代方法。
二、正文
第一种方法:
Python提供了独特的解决方案——装饰器。以下直接通过示例展示具体用法:
class CallingCounter(object):
def __init__ (self, func):
self.func = func
self.count = 0
def __call__ (self, *args, **kwargs):
self.count += 1
return self.func(*args, **kwargs)
@CallingCounter
def test():
print('我被调用了')
test()
print(f'我被调用了{test.count}次')若需统计类中方法的调用次数,只需将装饰器应用于目标函数前方即可生效。
class CallingCounter(object):
def __init__ (self, func):
self.func = func
self.count = 0
def __call__ (self, *args, **kwargs):
self.count += 1
return self.func(*args, **kwargs)
class Test:
@CallingCounter
def test():
print('我被调用了')
for i in range(10):
Test.test()
print(f'我被调用了{Test.test.count}次')若类中存在大量通过self调用的函数,直接应用上述装饰器可能会引发报错,提示self缺少相关属性或函数。此时建议参考第二种方法。
第二种方法:
def call_counter(func): def helper(*args, **kwargs): helper.calls += 1 return func(*args, **kwargs) helper.calls = 0 helper.__name__= func.__name__ return helper # 下面是使用装饰器 @call_counter def f(): pass print(f.calls) for _ in range(10): f() print(f.calls) # 0 10 # 这里是另一种调用方式 def f(): pass f = call_counter(f) print(f.calls) for _ in range(10): f() print(f.calls) # 0 10
前两种方法作者均已实测验证,下文再补充三种更为简便的实现方式(仅供参考)。
第3.1种方法(超简单)
calls = 0 def f(): global calls calls += 1 # do your func stuff here ## 如果想统计class中的函数使用次数,同理
第3.2种方法(超简单)
class Test(object):
def __init__(self):
self.calls = 0
def f(self):
self.calls += 1
# do your func stuff here
第3.3种方法(超简单)
class Test(object): calls = 0 def __init__(self): pass def f(self): Test.calls += 1 # do your func stuff here # 调用方式 # Test().f() A = Test() for i in range(10): A.f() print(A.calls) print(Test().calls) print(Test.calls)
三、小结
至此,关于Python统计函数调用次数的内容介绍完毕。如需了解更多相关技巧,可查阅本站历史文章或继续浏览后续内容,感谢支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













