问个小白问题,如何实现一个装饰器用来统计阶乘的运行时间?有些搞不懂

2018-03-15 20:33:28 +08:00
 juoyi

最后运行得完全超出预期 import time from functools import wraps

def timefunc(func):
    """统计一个函数的运行时间"""
    @wraps(func)
    def wrapper(*args, **kwargs):
        print('-------函数开始执行--------')
        start_time = time.time()  # 记录起始时间
        func(*args, **kwargs)  # 调用被装饰函数
        end_time = time.time()  # 记录结束时间
        run_time = end_time - start_time
        print("function %s runtime is %s " % (func.__name__, run_time))
        print('-------函数结束执行--------')

    return wrapper


@timefunc
def factorial(num):
    """计算一个正整数的阶乘"""
    if not isinstance(num, int):
        raise TypeError("参数必须为整型!")
    elif num <= 0:
        raise ValueError("请输入正整数!")
    elif num == 1:
        return 1
    else:
        return num * factorial(num-1)


if __name__ == '__main__':
    factorial(4)
1472 次点击
所在节点    问与答
4 条回复
kkzxak47
2018-03-15 20:42:06 +08:00
你先问怎么实现,然后把实现贴出来了。请问,你在问什么?
juoyi
2018-03-15 20:44:19 +08:00
@kkzxak47 没有啊,我以为自己懂了,自己实现了一下,结果还是报错,自己看了半天不知道具体是哪块逻辑有问题
zhzy
2018-03-15 22:05:45 +08:00
请善用搜索: http://bfy.tw/H7vO
Arthur2e5
2018-03-16 02:08:00 +08:00
https://stackoverflow.com/questions/43432956/how-a-decorator-works-when-the-argument-is-recursive-function

一模一样,人还知道至少要用一个更靠谱的计时呢
你不要直接包,等到最后再用 timefunc(factorial)(4) 之类的只包一次就是了…

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/438461

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX