此循环用于条形码扫描软件。它的运行次数可能与扫描条形码的次数相同,即一小时内扫描数百次。你知道吗
# 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()
的垃圾收集是不会发生的,在我的例子中,这是在一天结束时,用户完成了扫描。在那之前,这些东西甚至不会被视为垃圾。你知道吗
这不是一个问题,因为q是局部的,因此在返回后不会持久。你知道吗
如果你想让自己感觉好些,你可以试试
它可以做你现在正在做的事情,而不需要命名匹配-但它不会改变你的内存占用。你知道吗
(我假设您根本不关心打印值,它只是诊断)
如果print语句显示每个匹配都有自己的内存块,那么看起来有两种情况:
1)正如其他人提到的,您没有使用CPython作为解释器,您选择的解释器在垃圾收集方面做了一些奇怪的事情
2)这里有一段代码没有显示给我们,它保留了对match对象的引用,因此GC代码永远不会释放它,因为对match对象的引用计数永远不会达到零
这两种情况都是这样吗?你知道吗
cPython使用引用计数(加上一些循环引用检测,这里不适用)来处理对象的
gc
。一旦对象达到0个现有引用,它将立即被gc'd在循环的情况下:
locpats
中的每个连续的pat
将一个新的re.match
对象绑定到q
。这意味着旧的re.match
对象有0个剩余引用,将立即被垃圾收集。类似的情况也适用于从函数中return
。你知道吗这都是cPython的实现细节;其他类型的python将以不同的方式处理
gc
。在所有情况下,不要过早地优化。除非你能找到这样做的具体原因,否则单独使用gc
可能是最有效的解决方案。你知道吗相关问题 更多 >
编程相关推荐