python不能無(wú)限的遞歸調(diào)用下去。并且當(dāng)輸入的值太大,遞歸次數(shù)太多時(shí),python 都會(huì)報(bào)錯(cuò)
創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)成都全網(wǎng)營(yíng)銷(xiāo)、網(wǎng)站重做改版、南昌網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為南昌等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
首先說(shuō)結(jié)論,python解釋器這么會(huì)限制遞歸次數(shù),這么做為了避免"無(wú)限"調(diào)用導(dǎo)致的堆棧溢出。
tail recursion 就是指在程序最后一步執(zhí)行遞歸。這種函數(shù)稱(chēng)為 tail recursion function。舉個(gè)例子:
這個(gè)函數(shù)就是普通的遞歸函數(shù),它在遞歸之后又進(jìn)行了 乘 的操作。 這種普通遞歸,每一次遞歸調(diào)用都會(huì)重新推入一個(gè)調(diào)用堆棧。
把上述調(diào)用改成 tail recursion function
tail recursion 的好處是每一次都計(jì)算完,將結(jié)果傳遞給下一次調(diào)用,然后本次調(diào)用任務(wù)就結(jié)束了,不會(huì)參與到下一次的遞歸調(diào)用。這種情況下,只重復(fù)用到了一個(gè)堆棧。因此可以?xún)?yōu)化結(jié)構(gòu)。就算是多次循環(huán),也不會(huì)出現(xiàn)棧溢出的情況。這就是 tail recursion optimization 。
c和c++都有這種優(yōu)化, python沒(méi)有,所以限制了調(diào)用次數(shù),就是為了防止無(wú)限遞歸造成的棧溢出。
如果遞歸次數(shù)過(guò)多,導(dǎo)致了開(kāi)頭的報(bào)錯(cuò),可以使用 sys 包手動(dòng)設(shè)置recursion的limit
手動(dòng)放大 recursionlimit 限制:
#腳本里面直接這樣寫(xiě)就好了
import?random
def?R():
print?(random.randint(1,1000))
for?i?in?range(1,10):
R()
python 限制函數(shù)調(diào)用次數(shù)的實(shí)例講解
發(fā)布時(shí)間:2018-04-21 09:58:18 作者:隨便起個(gè)名字啊
下面小編就為大家分享一篇python 限制函數(shù)調(diào)用次數(shù)的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
如下代碼,限制某個(gè)函數(shù)在某個(gè)時(shí)間段的調(diào)用次數(shù),
靈感來(lái)源:python裝飾器-限制函數(shù)調(diào)用次數(shù)的方法(10s調(diào)用一次) 歡迎訪問(wèn)
原博客中指定的是緩存,我這里換成限制訪問(wèn)次數(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("超過(guò)調(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()