Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python for Linux中的垃圾收集_Python_Linux - Fatal编程技术网

Python for Linux中的垃圾收集

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分配内存时,它在第

我有点困惑Python是如何分配内存和垃圾收集的,以及这是如何特定于平台的。例如,当我们比较以下两个代码段时:

片段A:

>>> 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使用两种内存管理策略:

  • 参考计数
  • 标记并清除垃圾回收
  • 分配通常通过平台malloc/free函数完成,并继承底层运行时的性能特征。是否重用内存由操作系统决定。(有一些对象是由python vm汇集的)


    但是,您的示例不会触发“真实”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。但问题是为什么它在不同的平台上返回不同的值,有时根本不返回。下面是另一个有用的讨论: