2014-02-12 22 views
1

此循環用於條碼掃描軟件。它可以像掃描條碼一樣多次運行,一小時內可以運行數百次。清理重新匹配對象

# 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內不再需要匹配對象。我應該像這樣擦拭它嗎?

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

還是有更清潔的方式?我應該打擾一切嗎?

如果我理解正確(從this),垃圾收集與gc.collect()將不會發生,直到一個進程終止,在我的情況下是在用戶完成掃描的一天結束。直到那個時候,這些物體不會被視爲垃圾,甚至。

+0

你在運行cPython嗎? gc的行爲取決於你正在運行的python的風格。 – roippi

+2

'q = None'刪除本地名稱中的引用(或者說,用對'None'對象的引用替換它)。它對對象完全沒有任何影響。如果你想推理垃圾收集和內存使用,這個區別以及許多相關的區別是非常重要的。 – delnan

+3

你確定這是個問題嗎?您是否觀察過您的應用程序在一天內放緩或增長?就我們所知,它每小時分配10 KB,不值得擔心。 – Kevin

回答

3

cPython使用引用計數(加上一些循環引用檢測,這裏不適用)來處理對象的gc。一旦對象達到0現存引用,它將立即被gc'd。

在循環的情況下:

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

locpats每個連續pat綁定一個新re.match對象q。這意味着舊的re.match對象有0個剩餘的引用,並且會立即進行垃圾收集。當您的功能return時,類似的情況也適用。

這是cPython的所有實現細節;其他口味的python將以不同方式處理gc。在所有情況下,不要過早優化。除非您可以明確指出這樣做的具體原因,否則單獨保留gc可能是最高性能的解決方案。

+0

非常感謝。哎呀,Python真的很漂亮,很好實施。令人欣慰!對於像我這樣對於cPython和其他實現不熟悉的讀者,[這是一個很好的總結](http://stackoverflow.com/questions/17130975/python-vs-cpython)。 – RolfBly

0

這不是問題,因爲q是本地的,因此在返回後不會保留。

如果你想要讓自己感覺更好,你可以嘗試

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

將你現在在做什麼,而沒有命名的比賽 - 但它不會改變你的內存佔用。

(我假設你不關心印刷價值可言,它只是診斷)

+0

打印確實只是診斷,是的,它不會改變內存佔用。 – RolfBly

0

如果你的打印語句顯示,每場比賽取得自己的內存塊,然後它看起來像兩種情況之一發生了:

正如其他您不使用CPython的爲你解釋,你選擇的是做一些奇怪的垃圾回收解釋都提到

1)

2)有代碼,你的避風港」這裏向我們展示了保持對匹配對象的引用,以便GC代碼永遠不會將它釋放爲匹配對象的引用計數從未達到零

是這種情況嗎?