編輯:沒關係,我只是完全愚蠢。隱藏引用導致大量內存使用的函數參數?
我碰到與小串遞歸代碼來了,這裏是它的本質加上我的測試的東西:
def f(s):
if len(s) == 2**20:
input('check your memory usage again')
else:
f(s[1:])
input('check your memory usage, then press enter')
f('a' * (2**20 + 500))
通話之前,我的Python過程大約需要9 MB(通過Windows任務管理器作爲託運) 。在〜1MB字符串的500個級別之後,它的大小約爲513 MB。毫不奇怪,因爲每個調用級別在其變量s
中仍然保留其字符串。
但我試圖通過更換的參考字符串到新的字符串的引用來解決它,它仍然上升到513 MB:
def f(s):
if len(s) == 2**20:
input('check your memory usage again')
else:
s = s[1:]
f(s)
input('check your memory usage, then press enter')
f('a' * (2**20 + 500))
爲什麼不,讓熄滅記憶?字符串甚至只是變小,所以後來的字符串很容易適應早期字符串的空間。有沒有隱藏額外的字符串引用或發生了什麼?
我已經預料到這樣的表現,只上升到10 MB(1 MB的變化,符合市場預期,而老的字符串仍然存在,因爲新的字符串建):
input('check your memory usage, then press enter')
s = 'a' * (2**20 + 500)
while len(s) != 2**20:
s = s[1:]
input('check your memory usage again')
(不要介意窮人的時間複雜性,順便說一句,我知道,不要打擾。)
我看到兩者之間沒有什麼區別,說實話。 –
@StefanPochmann,如果你改用'del s [0]'會發生什麼? – BallpointBen
@James然後我得到'TypeError:'str'對象不支持項目刪除'。你沒有明白嗎?你使用的是什麼Python版本? –