下面是一個例子,用 for 循環(huán)調(diào)用 10 次 test 函數(shù),并把返回值加到 sum 變量中:
創(chuàng)新互聯(lián)公司主營舒蘭網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP開發(fā)公司,舒蘭h5微信平臺小程序開發(fā)搭建,舒蘭網(wǎng)站營銷推廣歡迎舒蘭等地區(qū)企業(yè)咨詢
#coding=utf-8
def?test(n):
return?n?+?1
sum?=?0
#?使用?for?循環(huán)調(diào)用?10?次?test?函數(shù)
for?i?in?range(10):
#?調(diào)用?test?函數(shù),并將返回值加到?sum?中
sum?=?sum?+?test(i)
print('sum?=?'?+?str(sum))
python 限制函數(shù)調(diào)用次數(shù)的實例講解
發(fā)布時間:2018-04-21 09:58:18 作者:隨便起個名字啊
下面小編就為大家分享一篇python 限制函數(shù)調(diào)用次數(shù)的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
如下代碼,限制某個函數(shù)在某個時間段的調(diào)用次數(shù),
靈感來源:python裝飾器-限制函數(shù)調(diào)用次數(shù)的方法(10s調(diào)用一次) 歡迎訪問
原博客中指定的是緩存,我這里換成限制訪問次數(shù),異曲同工
#newtest.py
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import time
def stat_called_time(func):
cache={}
limit_times=[10]
def _called_time(*args,**kwargs):
key=func.__name__
if key in cache.keys():
[call_times,updatetime]=cache[key]
if time.time()-updatetime 60:
cache[key][0]+=1
else:
cache[key]=[1,time.time()]
else:
call_times=1
cache[key]=[call_times,time.time()]
print('調(diào)用次數(shù): %s' % cache[key][0])
print('限制次數(shù): %s' % limit_times[0])
if cache[key][0] = limit_times[0]:
res=func(*args,**kwargs)
cache[key][1] = time.time()
return res
else:
print("超過調(diào)用次數(shù)了")
return None
return _called_time
@stat_called_time
def foo():
print("I'm foo")
if __name__=='__main__':
for i in range(10):
foo()
#test.py
from newtest import foo
import time
for i in range(30):
foo()
print('*'*20)
foo()
foo()
print('*'*20)
for i in range(60):
print(i)
time.sleep(1)
for i in range(11):
foo()
Python中提供了很多接口方便我們能夠靈活進(jìn)行性能分析,包括cProfile模塊中的Profile類和pstat模塊中的Stats類。
--cprofile是一種確定性分析器,只測量CPU時間,并不關(guān)心內(nèi)存的消耗情況和其他與內(nèi)存相關(guān)聯(lián)的信息
--它是基于Isprof的用C語言實現(xiàn)的擴(kuò)展應(yīng)用,運(yùn)行開銷比較合理,適合分析運(yùn)行時間較長的程序
--enable(): 開始進(jìn)行性能分析并收集數(shù)據(jù)
--disableI(): 停止性能分析
--create_stats(): 停止收集數(shù)據(jù),并為已經(jīng)收集的數(shù)據(jù)創(chuàng)建stats對象
--print_stats():創(chuàng)建stats對象并打印分析結(jié)果
--dump_stats(filename): 把當(dāng)前性能分析的內(nèi)容寫入文件filename中
--runcall(func, *args, **kwargs): 收集被調(diào)用函數(shù)func的性能分析信息
--用來分析cProfile輸出的文件內(nèi)容
--pstas模塊為開發(fā)者提供了Stats類,可以讀取和操作stats文件
(Stats類可以接受stats文件名,也可以直接接受cProfile.Profile對象作為數(shù)據(jù)源。)
--strip_dirs(): 刪除報告中所有函數(shù)文件名的路徑信息
--dump_stats(filename): 把stats中的分析數(shù)據(jù)寫入文件(也可以寫成cProfile.Profile.dump_stats())
--sort_stats(*keys): 對報告列表進(jìn)行排序,函數(shù)會一次按照傳入的參數(shù)排序
--reverse_order(): 逆反當(dāng)前的排序
--print_stats(*restrictions): 把信息打印到標(biāo)準(zhǔn)輸出。*restrictions用于控制打印結(jié)果的形式,比如(10,1.0,".*.py.*")表示打印所有py文件的信息的前10行結(jié)果
--第一行表示運(yùn)行這個函數(shù)一共使用0.043秒,執(zhí)行了845次函數(shù)調(diào)用
--第二行表示結(jié)果是按什么順序排列的(這里表示按照調(diào)用次數(shù)來進(jìn)行排列的)
--ncalls: 表示函數(shù)調(diào)用的次數(shù)(有兩個數(shù)值表示有遞歸調(diào)用,總調(diào)用次數(shù)/原生調(diào)用次數(shù))
--tottime: 函數(shù)內(nèi)部調(diào)用時間(不包括他自己調(diào)用的其他函數(shù)時間)
--percall: tottime/ncalls
--cumtime: 表示累計調(diào)用時間(函數(shù)執(zhí)行玩的總時間),它包含了函數(shù)自己內(nèi)部調(diào)用的函數(shù)時間
--filename:lineno(function): 函數(shù)所在的文件,行號,函數(shù)名稱
上面的函數(shù)do_cProfile(do=False, order='tottime')是一個帶參數(shù)的裝飾器,通過do的值來進(jìn)行性能分析的開關(guān)控制,通過order的值來選擇輸出結(jié)果按照什么方式進(jìn)行排序。
比如我們對函數(shù)A和函數(shù)B進(jìn)行性能分析
如果不給裝飾器傳入?yún)?shù)的話就是默認(rèn)的False和tottime
你好:
我對代碼做了注釋:
#last是一個列表,里面只有一個元素,就是1,說明已經(jīng)運(yùn)行一次
def?counter(last=[1]):
#last[0]將列表里面的第一個元素取出,然后加1,賦值給next
next?=?last[0]?+?1
#修改列表里面第一個元素的值
last[0]?=?next
#返回此時運(yùn)行的次數(shù)
return?next
在spider類里面加個計數(shù)變量啊,然后再closed() 方法里面添加log,把計數(shù)給打印出來
class MySpider(scrapy.Spider):
def __init__(self):
self.count = 0
def parse(self, response):
self.count += 1
def closed(self):
log(self.count)
#腳本里面直接這樣寫就好了import randomdef R(): print (random.randint(1,1000))for i in range(1,10): R()
網(wǎng)站欄目:python函數(shù)調(diào)用次數(shù),python統(tǒng)計函數(shù)調(diào)用次數(shù)
文章網(wǎng)址:http://vcdvsql.cn/article26/hedocg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、軟件開發(fā)、靜態(tài)網(wǎng)站、商城網(wǎng)站、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)