此循环用于条形码扫描软件。它可以在扫描条形码时运行多次,这在一小时内就是数百次。
# 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()
的垃圾回收,在我的情况下是在用户完成扫描的那天结束时。在那之前,这些物体甚至不会被视为垃圾。
答案 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代码永远不会释放它,因为匹配对象的引用计数永远不会达到零
这些都是这种情况吗?