清理重新匹配的对象

该循环用于条形码扫描软件。 它可以像扫描条码一样多次运行,一小时内可以运行数百次。

# 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

或者有更清晰的方法吗? 我应该打扰一切吗?

如果我理解正确(从此),使用gc.collect()垃圾收集将不会发生,直到进程终止,在我的情况下是在用户完成扫描的一天结束时。 直到那个时候,这些物体不会被视为垃圾,甚至。


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

在你的循环中:

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

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

这是cPython的所有实现细节; 其他口味的蟒蛇将不同地处理gc 。 在所有情况下,不要过早优化。 除非您可以明确指出这样做的具体原因,否则单独使用gc可能是最高性能的解决方案。


这不是问题,因为q是本地的,因此在返回后不会持续。

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

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

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

(我假设你完全不关心打印值,这只是诊断)


如果您的打印语句显示每个匹配都获得了自己的一块内存,那么它看起来像是发生了两件事之一:

1)正如其他人所说的,你并没有使用CPython作为你的解释器,而你选择的解释器正在做一些与垃圾收集有关的奇怪事情

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

是这种情况吗?

链接地址: http://www.djcxy.com/p/53157.html

上一篇: clean up re.match objects

下一篇: Where builtin functions are implemented