@@ -201,9 +201,18 @@ def __getitem__(self, key, cache_getitem=Cache.__getitem__):
201
201
202
202
def __setitem__ (self , key , value , cache_setitem = Cache .__setitem__ ):
203
203
cache_setitem (self , key , value )
204
- self .__touch (key )
204
+ if key in self .__nodes :
205
+ self .__touch (key )
206
+ else :
207
+ head = self .__head
208
+ node = head .next
209
+ if not node :
210
+ node = head .next = LFUCache ._Node (freq = 1 , next = None , prev = head )
211
+ node .items .add (key )
212
+ self .__nodes [key ] = node
205
213
206
214
def __delitem__ (self , key , cache_delitem = Cache .__delitem__ ):
215
+ # FIXME: delete empty nodes?
207
216
cache_delitem (self , key )
208
217
node = self .__nodes .pop (key )
209
218
node .items .remove (key )
@@ -213,33 +222,24 @@ def popitem(self):
213
222
curr = self .__head .next
214
223
while curr :
215
224
if curr .items :
216
- key = curr .items .pop () # we remove an arbitrary element
217
- del self .__nodes [key ]
225
+ key = next (iter (curr .items )) # remove an arbitrary element
218
226
return (key , self .pop (key ))
219
227
curr = curr .next
220
228
raise KeyError ("%s is empty" % type (self ).__name__ ) from None
221
229
222
230
def __touch (self , key ):
223
231
"""Increase use count"""
224
232
node = self .__nodes .get (key , None )
225
- if node is None :
226
- head = self .__head
227
- node = head .next
228
- if not node :
229
- node = head .next = LFUCache ._Node (freq = 1 , next = None , prev = head )
230
- node .items .add (key )
231
- self .__nodes [key ] = node
232
- else :
233
- # FIXME: remove empty nodes, otherwise this may grow without bounds?
234
- # FIXME: LFUDecoratorTest::test_decorator_needs_rlock fails here?
235
- assert key in node .items
236
- node .items .remove (key )
237
- nf = node .freq + 1
238
- nn = node .next
239
- if not nn or nn .freq != nf :
240
- nn = node .next = LFUCache ._Node (freq = nf , next = node .next , prev = node )
241
- nn .items .add (key )
242
- self .__nodes [key ] = nn
233
+ # FIXME: remove empty nodes, otherwise this may grow without bounds?
234
+ # FIXME: LFUDecoratorTest::test_decorator_needs_rlock fails here
235
+ assert key in node .items
236
+ node .items .remove (key )
237
+ nf = node .freq + 1
238
+ nn = node .next
239
+ if not nn or nn .freq != nf :
240
+ nn = node .next = LFUCache ._Node (freq = nf , next = node .next , prev = node )
241
+ nn .items .add (key )
242
+ self .__nodes [key ] = nn
243
243
244
244
245
245
class LRUCache (Cache ):
0 commit comments