编辑:没关系,我只是完全愚蠢。隐藏引用导致大量内存使用的函数参数?
我碰到与小串递归代码来了,这里是它的本质加上我的测试的东西:
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版本? –