清理重新匹配的对象
该循环用于条形码扫描软件。 它可以像扫描条码一样多次运行,一小时内可以运行数百次。
# 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