日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

python統(tǒng)計函數(shù)被調(diào)用次數(shù)的實現(xiàn)_python

作者:整天夢游的小jerry ? 更新時間: 2023-04-22 編程語言

一、前言

每當(dāng)做搜索任務(wù)或者時間復(fù)雜度任務(wù)相關(guān)時候,就會有統(tǒng)計函數(shù)被調(diào)用次數(shù)的需求。通常我們的做法是在函數(shù)前面定義一個變量,每循環(huán)調(diào)用一次,變量就加一,這不失為一種辦法,那么有沒有更高效的方法呢?

二、正文

第一種方法:

當(dāng)然有,那就是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('我被調(diào)用了')

test()
print(f'我被調(diào)用了{(lán)test.count}次')

如果是統(tǒng)計class中的函數(shù)被調(diào)用的次數(shù),就把 裝飾器 裝在被調(diào)用函數(shù)的前面即可。

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('我被調(diào)用了')

for i in range(10):
? ? Test.test()

print(f'我被調(diào)用了{(lán)Test.test.count}次')

如果你的class中有很多的self用來調(diào)用函數(shù),那么可能會報錯,提示self無xxx屬性or函數(shù)。這時候就要看第二種方法

第二種方法:

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

# 這里是另一種調(diào)用方式
def f():
? ? pass
f = call_counter(f)
print(f.calls)

for _ in range(10):
? ? f()
print(f.calls)
# 0 10

上面兩種方法筆者都親自做了測試,下面再介紹3個超簡單的(狗頭保命)

第3.1種方法(超簡單)

calls = 0

def f():
? ? global calls?
? ? calls ?+= 1
? ? # do your func stuff here
? ??
## 如果想統(tǒng)計class中的函數(shù)使用次數(shù),同理

第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

# 調(diào)用方式
# Test().f()

A = Test()
for i in range(10):
? ? A.f()
print(A.calls)
print(Test().calls)
print(Test.calls)

三、小結(jié)

原文鏈接:https://blog.csdn.net/weixin_43804047/article/details/128909029

欄目分類
最近更新