python函数中的内存何时释放

python函数中的内存何时释放,python,Python,我有以下代码: f = open(file).readlines() # 2GB file for item in f: print f # some other stuff g = open(file2).readlines() # 3 GB file for item in g: print g g的内存何时释放?对于f呢?如果没有释放,我该怎么做?假设是整个程序,在这两种情况下,内存将保留到程序终止 您可以通过添加以下内容来加快速度: f = None 在第一个循

我有以下代码:

f = open(file).readlines() # 2GB file
for item in f:
    print f

# some other stuff

g = open(file2).readlines() # 3 GB file
for item in g:
    print g

g
的内存何时释放?对于
f
呢?如果没有释放,我该怎么做?

假设是整个程序,在这两种情况下,内存将保留到程序终止

您可以通过添加以下内容来加快速度:

 f = None
在第一个循环之后。这将允许(但不要求)垃圾收集清理前2Gb


不过,最好采用一种不需要将整个magilla读入内存的文件处理方法。

假设这是整个程序,在这两种情况下,内存将保留到程序终止

您可以通过添加以下内容来加快速度:

 f = None
在第一个循环之后。这将允许(但不要求)垃圾收集清理前2Gb

不过,采用一种不需要将整个magilla读入内存的文件处理方法要好得多

何时从g释放内存

这取决于你所说的“自由”是什么意思

从Python的角度来看,它不是。只要您有一些可以随时使用的列表引用(您在变量
g
中这样做),它就不能被释放。否则,如果以后尝试使用
g
,会发生什么情况?但是Python的观点并不是基于计算机中的实际RAM芯片。你的操作系统让每个程序都假装拥有比它所需要的更多的内存;有关这方面的更多信息,请参见下面的内容,但现在让我们继续使用Python的视图

如果放弃对该列表的所有引用,例如,通过从当前作用域返回,或将其他内容分配给
g
,或执行
delg
(所有操作都假定该引用是唯一的引用),则可以释放用于该列表的所有内存。(在CPython中,通常会立即发生;在其他实现中,通常只是“很快”。)

但“释放”并不意味着“回到操作系统”。一般来说,它将保留在一个自由列表中(实际上,是几个不同级别的自由列表),前提是如果您现在想要3GB,您很可能会再次想要3GB,因此Python也可以保留存储,因为这比重新分配快。(因此,如果您在创建
g
之前释放了
f
,那么
g
将从自由列表中取出大部分2GB,只分配另外1GB。)


但“不返回操作系统”并不意味着“连接到物理内存”。在这里我们可以看到Python视图和硬件视图之间的区别。如果您只有(比如)8GB的物理RAM,并且有6个程序同时拥有12GB的数据,那么额外的64GB放在哪里呢?它存储在磁盘上,并在下次尝试使用时从磁盘重新加载。通常情况下,它会做得很好。**因此,如果你再也不接触3GB,而系统上的其他程序需要一些内存,你的操作系统可能会将其从RAM中分页,而不会将其重新分页


另一方面,您也从不关闭文件对象。这意味着在垃圾收集器注意到没有人再使用它们之前,文件句柄仍然是打开的。同样,这通常会立即在CPython中实现,而不是在其他实现中。但不要依赖于此
close
关闭文件,或者更好地使用
with
语句


*在这里插入640K笑话

**但很容易恶意或意外地阻止它做好工作。例如,创建一个300亿整数的列表,并不断随机更改随机值,您的操作系统将花费大量时间来交换页面,以至于无法执行任何其他操作

何时从g释放内存

这取决于你所说的“自由”是什么意思

从Python的角度来看,它不是。只要您有一些可以随时使用的列表引用(您在变量
g
中这样做),它就不能被释放。否则,如果以后尝试使用
g
,会发生什么情况?但是Python的观点并不是基于计算机中的实际RAM芯片。你的操作系统让每个程序都假装拥有比它所需要的更多的内存;有关这方面的更多信息,请参见下面的内容,但现在让我们继续使用Python的视图

如果放弃对该列表的所有引用,例如,通过从当前作用域返回,或将其他内容分配给
g
,或执行
delg
(所有操作都假定该引用是唯一的引用),则可以释放用于该列表的所有内存。(在CPython中,通常会立即发生;在其他实现中,通常只是“很快”。)

但“释放”并不意味着“回到操作系统”。一般来说,它将保留在一个自由列表中(实际上,是几个不同级别的自由列表),前提是如果您现在想要3GB,您很可能会再次想要3GB,因此Python也可以保留存储,因为这比重新分配快。(因此,如果您在创建
g
之前释放了
f
,那么
g
将从自由列表中取出大部分2GB,只分配另外1GB。)


但“不返回操作系统”并不意味着“连接到物理内存”。在这里我们可以看到Python视图和硬件视图之间的区别。如果您只有(比如)8GB的物理RAM,并且有6个程序同时拥有12GB的数据,那么额外的64GB放在哪里呢?它存储在磁盘上,并在下次尝试使用时从磁盘重新加载。通常情况下,它会在这方面做得很好。**因此,如果你再也不接触3GB,而系统上的其他程序需要一些内存,那么你的操作系统