在我的脚本中,我从套接字读取消息,并根据消息中的内容更改内存中某些对象的状态。一切正常。
但我希望删除非活动对象:例如,如果在某段时间内没有指定对象的消息,则应删除它。最好的方法是什么?
答案 0 :(得分:4)
这个可能不适合你,但是: 如果你没有在指定的时间之后删除对象,但只保留指定的 number 对象,那么Python 3.2就有functools.lru_cache。
答案 1 :(得分:1)
在每个对象中存储时间戳 - 每当您修改时间戳时,都会将时间戳更新为当前时间。
然后有一些经常运行的东西,查看所有对象,并删除任何时间戳早于当前时间之前的特定量。
答案 2 :(得分:1)
如果您遇到Python 2,或者如果您需要基于时间戳而且Amber的答案不够快,您可以对Python 3的lru_cache做什么做一些变化,但是将对象的修改时间变为帐户:
(我没有对此进行测试;希望这些错误很小,而且想法很明确。)
将对象存储在OrderedDict(对于早于2.7的Pythons有一个package)。
import collections
objects = collections.OrderedDict()
我假设您为每个对象都有一些键,以便您可以在流中识别它们。执行常规查找的变体,从dict中删除并重新插入已存在的对象。这将使OrderedDict按上次访问进行排序。
try:
obj = objects.pop(the_key)
except KeyError:
obj = create_new_object(the_key)
objects[the_key] = obj
obj.timestamp = current_time()
然后,每隔一段时间(或每次)删除旧对象。 LRU变体(限制对象的数量)很容易:
while len(objects) > some_threshold:
objects.popitem(last=False)
基于时间戳的变体有点棘手,但并不多。最旧的条目位于前面,所以我们只需看第一个,如果它太古老就弹出它。
while objects:
obj = objects.itervalues().next() # Python 2 only :(
if obj.timestamp < some_threshold():
objects.popitem(last=False)
else:
break
眼球分析表明,这可以让您在两种变体中分摊O(1)访问权限和O(丢弃对象数量)维护。