繁体   English   中英

测试python备忘录装饰器

[英]Testing python memo decorator

我有以下装饰器:

def memo(f):
        """Decorator that caches the return value for each call to f(args).
        Then when called again with same args, we can just look it up."""
        cache = {}

        def _f(*args):
            try:
                return cache[args]
            except KeyError:
                cache[args] = result = f(*args)
                return result
            except TypeError:
                # some element of args can't be a dict key
                return f(args)

        return _f

我需要编写一些测试来了解它是否有效。 我如何测试这样的装饰器? 我只是设法编写性能测试,以了解它是否可以加快功能。

def test_memo(self):
        def fib(n):
            if n == 0:
                return 0
            elif n == 1:
                return 1
            else:
                return fib(n - 1) + fib(n - 2)

        @memo
        def cached_fib(n):
            if n == 0:
                return 0
            elif n == 1:
                return 1
            else:
                return cached_fib(n - 1) + cached_fib(n - 2)

        t0 = time.clock()
        fib(20)
        t = time.clock() - t0

        t1 = time.clock()
        cached_fib(20)
        t2 = time.clock() - t1
        self.assertGreater(t, t2)

测试它是否在缓存中存储一​​些值也许是明智的,但是我不知道如何在python中实现它。 有任何想法吗?

对于相同的参数,应该对已取消组合的函数调用一次。 检查一下。

def test_memo__function_should_be_called_once_for_same_arg(self):
    @memo
    def f(arg):
        f.call_count += 1
        return arg
    f.call_count = 0

    self.assertEqual(f(1), 1)
    self.assertEqual(f(1), 1)
    self.assertEqual(f.call_count, 1)

    self.assertEqual(f(2), 2)
    self.assertEqual(f(2), 2)
    self.assertEqual(f(2), 2)
    self.assertEqual(f.call_count, 2)

顺便说一句,在cached_fib函数中,它应该调用cache_fib ,而不是fib来利用cache_fib

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM