Python字典在重新分配时是否释放了所有内存?

2024-10-02 22:35:22 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中工作。我有一个函数从队列中读取,并基于从队列读取的记录中的一些XML标记创建字典,然后返回该字典。我把这个函数称为永远的循环。词典每次都要重新分配。字典以前使用的内存是在每次重新分配时释放的,还是孤立的并最终导致内存问题?在

def readq():
    qtags = {}
    # Omitted code to read the queue record, get XML string, DOMify it

    qtags['result'] = "Success"
    qtags['call_offer_time'] = get_node_value_by_name(audio_dom, 'call_offer_time')
    # More omitted code to extract the rest of the tags

    return qtags

while signals.sigterm_caught == False:
    tags = readq()
    if tags['result'] == "Empty":
        time.sleep(SLEEP_TIME)
        continue
    # Do stuff with the tags

所以,当我每次在循环中重新分配标记时,上一次分配使用的内存是否会在被新分配分配之前释放?在


Tags: theto函数内存标记get字典time
3条回答

不,它将在创建新对象后释放。在

为了使旧对象的引用计数减少,tags必须指向新对象。这发生在readq返回之后,因此至少从qtags = {}开始到{}之后,这两个对象都将存在。在

正如@delnan所说,tags被指向新对象后不久,旧对象将被垃圾回收器释放,因为不再有对它的引用。在

通常,Python可以跟上你扔给它的任何东西。Python中使用的垃圾回收器使用引用计数,因此内存使用量应该是恒定的,不会在内存中看到任何峰值。当你移除一个引用(将变量分配给其他对象)时,垃圾回收器会将内存扔回“堆”。所以不要担心记忆。我已经运行了几个小时的模拟器来测试重写变量,但是内存使用量保持不变。当你给它分配一个新字典时,它将被释放。在

如果可以证明(根据语言实现在运行时所掌握的知识),对象的内存不可能再被访问,并且垃圾回收器认为它适合进行收集,那么该对象的内存将被释放。这是绝对最小值,你不应该再假设了。你通常不应该再担心什么了。在

更实际地说,它可以在最后一次引用之间的某个时间点释放(其中“reference”不限于作用域中的名称,但可以是任何使对象reachable)被删除和内存耗尽的时间点。它不必由运行代码的Python实现释放,它也可以将内存清理留给操作系统,而不必考虑任何终结器等。请注意,在最后一次引用终止和内存使用实际下降之间可能会有明显的延迟。但如前所述,如果有垃圾要收集,大多数实现都会尽力避免过度的内存使用。在

更实际的情况是,您可能会在CPython(引用实现)上运行它,CPython总是使用引用计数(用一个真正的GC来处理循环引用),所以除非有循环引用(相对较少,而且您的代码看起来没有它们,但是可以发生,例如它将在最后一个对它的引用被删除/覆盖时被释放。当然,其他实现并不是那么可预测的—PyPy本身就有六个不同的垃圾收集器,除了一个属于上述段落的垃圾收集器之外。在

相关问题 更多 >