清理重新匹配物体

2024-03-28 10:58:55 发布

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

此循环用于条形码扫描软件。它的运行次数可能与扫描条形码的次数相同,即一小时内扫描数百次。你知道吗

# locpats is a list of regular expression patterns of possible depot locations

for pat in locpats:
    q = re.match(pat, scannedcode)
    if q:
        print(q)
        return True

q是匹配对象。print(q)告诉我每个匹配对象都有自己的一小块内存。他们会加起来的。我不知道总共有多少。你知道吗

一旦进入if,我就不再需要Match对象了。我应该这样擦吗?你知道吗

    q = re.match(pat, scannedcode)
    if q:
        q = None
        return True

还是有更干净的方法?我要麻烦你吗?你知道吗

如果我的理解是正确的(从this),那么在进程终止之前,gc.collect()的垃圾收集是不会发生的,在我的例子中,这是在一天结束时,用户完成了扫描。在那之前,这些东西甚至不会被视为垃圾。你知道吗


Tags: of对象retruereturnif软件match
3条回答

这不是一个问题,因为q是局部的,因此在返回后不会持久。你知道吗

如果你想让自己感觉好些,你可以试试

if re.match(pat, scannedcode):
  return True

它可以做你现在正在做的事情,而不需要命名匹配-但它不会改变你的内存占用。你知道吗

(我假设您根本不关心打印值,它只是诊断)

如果print语句显示每个匹配都有自己的内存块,那么看起来有两种情况:

1)正如其他人提到的,您没有使用CPython作为解释器,您选择的解释器在垃圾收集方面做了一些奇怪的事情

2)这里有一段代码没有显示给我们,它保留了对match对象的引用,因此GC代码永远不会释放它,因为对match对象的引用计数永远不会达到零

这两种情况都是这样吗?你知道吗

cPython使用引用计数(加上一些循环引用检测,这里不适用)来处理对象的gc。一旦对象达到0个现有引用,它将立即被gc'd

在循环的情况下:

for pat in locpats:
    q = re.match(pat, scannedcode)

locpats中的每个连续的pat将一个新的re.match对象绑定到q。这意味着旧的re.match对象有0个剩余引用,将立即被垃圾收集。类似的情况也适用于从函数中return。你知道吗

这都是cPython的实现细节;其他类型的python将以不同的方式处理gc。在所有情况下,不要过早地优化。除非你能找到这样做的具体原因,否则单独使用gc可能是最有效的解决方案。你知道吗

相关问题 更多 >