清理re.match对象

时间:2014-02-12 15:15:28

标签: python regex garbage-collection

此循环用于条形码扫描软件。它可以在扫描条形码时运行多次,这在一小时内就是数百次。

# 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是Match对象。 print(q)告诉我每个匹配对象都有自己的小内存。他们会加起来。我不知道总共有多少钱。

我在if内不再需要Match对象了。我应该这样擦拭吗?

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

或者有更清洁的方式吗?我应该打扰吗?

如果我理解正确(来自this),则在进程终止之前不会发生使用gc.collect()的垃圾回收,在我的情况下是在用户完成扫描的那天结束时。在那之前,这些物体甚至不会被视为垃圾。

3 个答案:

答案 0 :(得分:3)

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

对于你的循环:

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

pat中的每个连续locpats都会将新的re.match对象绑定到q。这意味着旧的re.match对象有剩余的0个引用,并且会立即进行垃圾回收。当您从函数中return时,也会出现类似的情况。

这是cPython的所有实现细节;其他版本的python将以不同的方式处理gc。在所有情况下,不要过早优化。除非您能够确定具体原因,否则单独留出gc可能是最有效的解决方案。

答案 1 :(得分:0)

这不是问题,因为q是本地的,因此在您返回后不会保留。

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

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

这将完成您现在正在做的事情,而无需命名匹配 - 但它不会改变您的内存占用。

(我假设你根本不在乎印刷价值,只是诊断)

答案 2 :(得分:0)

如果你的print语句显示每个匹配都有自己的内存,那么它看起来就像是发生了两件事之一:

1)正如其他人提到的那样,你没有使用CPython作为你的翻译,你选择的解释器正在用垃圾收集做一些奇怪的事情

2)这里没有向我们展示的代码是保持对匹配对象的引用,以便GC代码永远不会释放它,因为匹配对象的引用计数永远不会达到零

这些都是这种情况吗?