2

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)

効率悪すぎない?2 つのリスト ループを使用しましたが、他の方法が見つかりませんでした

4

5 に答える 5

3

昨年の SciPy カンファレンスで、スピーカーがループでタスクを実行するための高速な方法であるany()と述べた講演に参加しました。all()それは理にかなっている; ループはfor反復ごとにループ変数を再バインドしますがany()all()単純に値を消費します。

明らかに、any()のような常に false 値を返す関数を実行する場合に使用します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)
于 2012-11-08T20:11:56.373 に答える
1

これはどうですか?

_ = [self.pop(k) for k,v in self.items() if v.lastAccess>checkTime]
于 2012-11-08T04:12:20.457 に答える
1

生成したリストは必要ないため、ジェネレーターと、この消費レシピのスニペットを使用できます。特に、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_off の反復中に辞書が変更されるためself.keys()、リストを返す which を使用します。( を使用self.iteritems()すると a が発生しRuntimeErrorます。)

于 2012-11-08T04:18:45.727 に答える
0

私の(完全に読めない解決策):

from operator import delitem
map(lambda k: delitem(self,k), filter(lambda k: self[k].lastAccess<checkTime, iter(self)))

しかし、少なくともそれはかなり時間とメモリ効率が良いはずです;-)

于 2012-11-08T04:48:43.550 に答える
0

パフォーマンスが問題であり、大量のデータがある場合は、memcachedやredisなどのシステムでPythonフロントエンドを使用することを検討することをお勧めします。それらはあなたのために期限切れの古いデータを処理することができます。

http://memcached.org/

http://pypi.python.org/pypi/python-memcached/

http://redis.io/

https://github.com/andymccurdy/redis-py

于 2012-11-08T20:38:20.240 に答える