Python for Linux中的垃圾收集
我有点困惑Python是如何分配内存和垃圾收集的,以及这是如何特定于平台的。例如,当我们比较以下两个代码段时: 片段A:Python for Linux中的垃圾收集,python,linux,Python,Linux,我有点困惑Python是如何分配内存和垃圾收集的,以及这是如何特定于平台的。例如,当我们比较以下两个代码段时: 片段A: >>> id('x' * 10000000) == id('x' * 10000000) True 片段B: >>> x = "x"*10000000 >>> y = "x"*10000000 >>> id(x) == id(y) False 代码段A返回true,因为当Python分配内存时,它在第
>>> id('x' * 10000000) == id('x' * 10000000)
True
片段B:
>>> x = "x"*10000000
>>> y = "x"*10000000
>>> id(x) == id(y)
False
代码段A返回true,因为当Python分配内存时,它在第一个测试中将内存分配到相同的位置,在第二个测试中将内存分配到不同的位置,这就是它们的内存位置不同的原因
但显然,系统性能或平台会影响这一点,因为当我在更大范围内尝试这一点时:
for i in xrange(1, 1000000000):
if id('x' * i) != id('x' * i):
print i
break
Mac上的一个朋友尝试了这个,它一直运行到最后。当我在一堆Linux虚拟机上运行它时,它总是在不同的虚拟机上返回(但时间不同)。这是因为Python中的垃圾收集调度吗?是因为我的Linux虚拟机的处理速度低于Mac,还是Linux Python实现的垃圾收集方式有所不同?垃圾收集器只使用任何方便的空间。有很多不同的垃圾收集策略,而且还受参数、不同平台、内存使用、月亮相位等的影响。试图猜测解释器将如何分配特定对象只是浪费时间。CPython使用两种内存管理策略:
但是,您的示例不会触发“真实”GC算法(这仅用于收集周期)。一旦删除最后一个引用,长字符串就会被释放。这是因为python缓存小整数和字符串: 大字符串:存储在未缓存的变量中:
In [32]: x = "x"*10000000
In [33]: y = "x"*10000000
In [34]: x is y
Out[34]: False
大字符串:不存储在变量中,看起来像缓存的:
In [35]: id('x' * 10000000) == id('x' * 10000000)
Out[35]: True
小字符串:缓存
In [36]: x="abcd"
In [37]: y="abcd"
In [38]: x is y
Out[38]: True
小整数:缓存
In [39]: x=3
In [40]: y=3
In [41]: x is y
Out[41]: True
大整数:
存储在变量中:未缓存
In [49]: x=12345678
In [50]: y=12345678
In [51]: x is y
Out[51]: False
未存储:缓存
In [52]: id(12345678)==id(12345678)
Out[52]: True
CPython就是这么做的。虽然知道这对黑客、解释个别实验的结果等都很有用,但它最终与缓存整数一样是一个实现细节。没错,是固定的。我仍然认为最初的问题是针对CPythons行为的。这并不能解释问题所问的行为。@sbu他观察到的行为是python缓存的结果。所以我试着解释一下。不,不是。Interning解释了为什么它不会每次返回1。但问题是为什么它在不同的平台上返回不同的值,有时根本不返回。下面是另一个有用的讨论: