比如有兩個函式,格式大致如下,手打,忽略格式
由于funb會產生大量的記憶體,請問如何呼叫完就釋放記憶體
def funb(x):
count = 0
for i in range(1, x+1):
count = count + i
def funa():
print funb(10000000000)
main:
funa()
uj5u.com熱心網友回復:
我的理解,如果是在一個函式里面用到list,里面元素大量增加,回傳之后,區域變數應該是自動釋放記憶體的啊uj5u.com熱心網友回復:
你理解的funb產生大量記憶體,大量在哪呢?count 嗎? 對計算機底層,count就像一個籃子,一直往一個籃子里面加東西,記憶體就一個,所以不會產生大量。
i 嗎? 一個 i 一個籃子,生成一個用一個,完了再生成,再用,也不會產生大量記憶體啊。
假如:你這里定義了x個變數,也就是x個籃子,那么在函式運行結束后,這些籃子就被回收了。(自動回收)
python在自身語言的基礎上,把回收記憶體已經自己搞定了。
如果想深入了解記憶體使用情況,去學C語言吧,學起來更形象點。
uj5u.com熱心網友回復:
解答很詳細,謝謝
我之前在python2上,記憶體超限,換成python3就沒這個問題了,以后用python3
uj5u.com熱心網友回復:
可以看看python2和python3的存盤最大值,這應該不是產生大量記憶體問題,是計算結果超過變數能保存的最大值(這個只是猜測)
也就是,一個變數(籃子)最大能存盤的值,有上限的,不會讓你一直放。你的funb(x)引數x是一個很大的值,count算出來也是一個很大的值,這個值可能因為變數存盤的最大值固定,你這個值太大,超過了這個值,所以會報錯。
可以拿著報錯,去百度查查原因。應該是這個問題。
uj5u.com熱心網友回復:
函式里的區域變數在函式執行后就釋放了吧uj5u.com熱心網友回復:
你說的應該是做1服務端的時候記憶體占用一直降不下來吧,這個可以參考https://blog.csdn.net/jiangjiang_jian/article/details/79140742uj5u.com熱心網友回復:
看看Python的垃圾回識訓制,記憶體的回收不是實時的,當然你也可以呼叫gc.collect()來主動回收。看別人的回復不能全信,有的回復也是一知半解,讓不懂的人感覺貌似正確,這樣容易誤導,還是要自己查查資料。另外,對于生成一個很大的資料來做遍(range(1, x+1)),這個確實耗記憶體,可以用yield生成迭代器來替代。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/132421.html
