这是删除di中对象的正确方法吗

2024-04-26 13:21:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个继承dict的类,我编写了一个成员方法来删除对象。你知道吗

class RoleCOList(dict):
    def __init__(self):
        dict.__init__(self)

    def recyle(self):
        '''
        remove roles too long no access
        '''
        checkTime = time.time()-60*30
        l = [k for k,v in self.items() if v.lastAccess>checkTime]
        for x in l:
            self.pop(x)

是不是效率太低了?我用了两个列表循环,但我找不到其他方法


Tags: 对象方法inselffortimeinitdef
3条回答

因为不需要生成的列表,所以可以使用生成器和来自consume recipe的代码段。特别是,使用collections.deque为您运行生成器。你知道吗

checkTime = time.time()-60*30

# Create a generator for all the values you will age off
age_off = (self.pop(k) for k in self.keys() if self[k].lastAccess>checkTime)

# Let deque handle iteration (in one shot, with little memory footprint)
collections.deque(age_off,maxlen=0)

由于字典在age\u off的迭代过程中被更改,因此使用self.keys()返回一个列表。(使用self.iteritems()将引发RuntimeError。)

这个怎么样?你知道吗

_ = [self.pop(k) for k,v in self.items() if v.lastAccess>checkTime]

在去年的SciPy会议上,我参加了一个演讲,演讲人说any()all()是在循环中快速完成任务的方法。这是有意义的,for循环在每次迭代时重新绑定循环变量,而any()all()只是消耗值。你知道吗

显然,当您想运行一个总是返回假值的函数时,您可以使用any(),比如None。这样,整个循环将运行到最后。你知道吗

checkTime = time.time() - 60*30

# use any() as a fast way to run a loop
# The .__delitem__() method always returns `None`, so this runs the whole loop
lst = [k for k in self.keys() if self[k].lastAccess > checkTime]
any(self.__delitem__(k) for k in lst)

相关问题 更多 >