Commit 9a62d9d5 authored by Raymond Hettinger's avatar Raymond Hettinger

Support cache sizes.

parent a69906b5
......@@ -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]
......
......@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment