Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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 临时存储器的内存消耗和寿命_Python - Fatal编程技术网

Python 临时存储器的内存消耗和寿命

Python 临时存储器的内存消耗和寿命,python,Python,我有一段python代码,其中内存消耗随着时间的推移而稳步增长。虽然有几个对象可以合理地增长得相当大,但我试图了解我观察到的内存占用是否是由于这些对象造成的,或者只是我在内存中乱丢了临时内存,这些临时内存并没有得到适当的处理,因为它们是最近从手动内存管理世界转换过来的,我想我只是不太了解python运行时如何处理临时对象的一些非常基本的方面 考虑一个大致具有这种一般结构的代码,我忽略了不相关的细节: def tweak_list(lst): new_lst = copy.deepcopy

我有一段python代码,其中内存消耗随着时间的推移而稳步增长。虽然有几个对象可以合理地增长得相当大,但我试图了解我观察到的内存占用是否是由于这些对象造成的,或者只是我在内存中乱丢了临时内存,这些临时内存并没有得到适当的处理,因为它们是最近从手动内存管理世界转换过来的,我想我只是不太了解python运行时如何处理临时对象的一些非常基本的方面

考虑一个大致具有这种一般结构的代码,我忽略了不相关的细节:

def tweak_list(lst):
    new_lst = copy.deepcopy(lst)
    if numpy.random.rand() > 0.5:
        new_lst[0] += 1  # in real code, the operation is a little more sensible :-)
        return new_lst
    else:
        return lst


lst = [1, 2, 3]
cache = {}

# main loop
for step in xrange(some_large_number):

    lst = tweak_list(lst)    # <<-----(1)

    # do something with lst here, cut out for clarity

    cache[tuple(lst)] = 42   # <<-----(2)

    if step%chunk_size == 0:
        # dump the cache dict to a DB, free the memory (?)
        cache = {}           # <<-----(3)
问题:

在调整列表中创建的新列表的生存期是多少?它会在出口处被销毁,还是在哪一点被垃圾收集?。反复调用调整列表是否会产生大量的小列表,并在长时间内徘徊? 将列表转换为元组用作dict键时是否有临时创建? 将dict设置为空会释放内存吗? 或者,我是从一个完全错误的角度来看待眼前的问题吗?
您可能希望将其作为分析内存使用情况的一种方法。我想在某些情况下也会用到它,但我不熟悉它。也是一个值得关注的强大工具。

您可能希望将其作为分析内存使用情况的一种方法。我想在某些情况下也会用到它,但我不熟悉它。也是一个强有力的工具,采取乐

当函数存在且未返回时,将清除新的\u lst。它的引用计数下降到0,并且可以进行垃圾收集。在当前的cpython实现中,这种情况会立即发生

如果返回,则由new_lst引用的值替换lst;lst引用的列表的引用计数下降了1,但是new_lst最初引用的值仍然被另一个变量引用

元组键是存储在dict中的值,因此它不是临时值。除了该元组,不会创建其他对象

用新的缓存dict替换旧的缓存dict将使引用计数减少1。如果缓存是对dict的唯一引用,它将被垃圾收集。然后,这将导致包含的所有元组键的引用计数下降1。如果没有其他引用,这些引用将被垃圾收集

请注意,当Python释放内存时,并不一定意味着操作系统会立即回收内存。大多数操作系统只会在其他事情需要内存时回收内存,而不是假定程序可能很快再次需要部分或全部内存

当函数存在且未返回时,将清除新的\u lst。它的引用计数下降到0,并且可以进行垃圾收集。在当前的cpython实现中,这种情况会立即发生

如果返回,则由new_lst引用的值替换lst;lst引用的列表的引用计数下降了1,但是new_lst最初引用的值仍然被另一个变量引用

元组键是存储在dict中的值,因此它不是临时值。除了该元组,不会创建其他对象

用新的缓存dict替换旧的缓存dict将使引用计数减少1。如果缓存是对dict的唯一引用,它将被垃圾收集。然后,这将导致包含的所有元组键的引用计数下降1。如果没有其他引用,这些引用将被垃圾收集

请注意,当Python释放内存时,并不一定意味着操作系统会立即回收内存。大多数操作系统只会在其他事情需要内存时回收内存,而不是假定程序可能很快再次需要部分或全部内存


当您运行这里显示的代码时,您是否仍然看到内存随着时间的推移而增加?问:为什么要使用deepcopy?您的列表是否包含比数字更复杂的对象?如果没有,为什么不使用一个浅拷贝或只是列表呢。如果是,那么这很可能是泄漏的原因,因为它们将被复制,然后作为键存储在缓存中。@lqc:在这里公认的愚蠢示例中,调整列表在大约50%的调用中修改其参数;在其他50%的情况下,它需要保持列表不变。当然,我可以只操作一个视图,lst[:],但那真的会不同吗?@interjay:不,没有。我的问题更多的是关于python的情况。当您运行这里展示的代码时,您是否仍然看到内存随着时间的推移而增加?问:为什么要使用deepcopy?您的列表是否包含比数字更复杂的对象?如果没有,为什么不使用一个浅拷贝或只是列表呢。如果是,那么这很可能是泄漏的原因,因为它们将被复制,然后作为键存储在缓存中。@lqc:在这里公认的愚蠢示例中,调整列表在大约50%的调用中修改其参数;换句话说
50%需要保持列表不变。当然,我可以只操作一个视图,lst[:],但那真的会不同吗?@interjay:不,没有。我的问题更多的是关于python的引擎盖下发生了什么。@lqc:clearized;它并不总是返回的。@lqc:已澄清;它并不总是被退回。