如何及时跟踪对象状态?

时间:2011-10-03 13:12:41

标签: python

在我的脚本中,我从套接字读取消息,并根据消息中的内容更改内存中某些对象的状态。一切正常。

但我希望删除非活动对象:例如,如果在某段时间内没有指定对象的消息,则应删除它。最好的方法是什么?

3 个答案:

答案 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(丢弃对象数量)维护。