Support cache sizes.

This commit is contained in:
Raymond Hettinger 2010-08-14 23:52:08 +00:00
parent a893927491
commit 0f56e90f05
2 changed files with 49 additions and 1 deletions

View File

@ -144,7 +144,7 @@ def lfu_cache(maxsize=100):
wrapper.misses += 1
if len(cache) > maxsize:
# purge the 10% least frequently used entries
for key, _ in nsmallest(maxsize // 10,
for key, _ in nsmallest(maxsize // 10 or 1,
use_count.items(),
key=itemgetter(1)):
del cache[key], use_count[key]

View File

@ -482,6 +482,30 @@ class TestLRU(unittest.TestCase):
self.assertEqual(f.hits, 0)
self.assertEqual(f.misses, 1)
# test size zero (which means "never-cache")
f_cnt = 0
@functools.lru_cache(0)
def f():
nonlocal f_cnt
f_cnt += 1
return 20
self.assertEqual(f(), 20)
self.assertEqual(f(), 20)
self.assertEqual(f(), 20)
self.assertEqual(f_cnt, 3)
# test size one
f_cnt = 0
@functools.lru_cache(1)
def f():
nonlocal f_cnt
f_cnt += 1
return 20
self.assertEqual(f(), 20)
self.assertEqual(f(), 20)
self.assertEqual(f(), 20)
self.assertEqual(f_cnt, 1)
def test_lfu(self):
def orig(x, y):
return 3*x+y
@ -503,6 +527,30 @@ class TestLRU(unittest.TestCase):
self.assertEqual(f.hits, 0)
self.assertEqual(f.misses, 1)
# test size zero (which means "never-cache")
f_cnt = 0
@functools.lfu_cache(0)
def f():
nonlocal f_cnt
f_cnt += 1
return 20
self.assertEqual(f(), 20)
self.assertEqual(f(), 20)
self.assertEqual(f(), 20)
self.assertEqual(f_cnt, 3)
# test size one
f_cnt = 0
@functools.lfu_cache(1)
def f():
nonlocal f_cnt
f_cnt += 1
return 20
self.assertEqual(f(), 20)
self.assertEqual(f(), 20)
self.assertEqual(f(), 20)
self.assertEqual(f_cnt, 1)
def test_main(verbose=None):
test_classes = (
TestPartial,