鱼C论坛

 找回密码
 立即注册
查看: 2059|回复: 2

python中装饰器的运行问题

[复制链接]
发表于 2021-6-2 23:24:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import time
  2. import functools


  3. def clock(func):
  4.     @functools.wraps(func)
  5.     def clocked(*args, **kwargs):
  6.         t0 = time.time()
  7.         result = func(*args, **kwargs)
  8.         elapsed = time.time() - t0
  9.         name = func.__name__
  10.         arg_lst = []
  11.         if args:
  12.             arg_lst.append(','.join(repr(arg) for arg in args))
  13.         if kwargs:
  14.             pairs = ['%s=%r' % (k, w) for k, w in sorted(kwargs.items())]
  15.             arg_lst.append(','.join(pairs))
  16.         arg_str = ','.join(arg_lst)
  17.         print('[%0.8fs] %s(%s)-> %r' % (elapsed, name, arg_str, result))
  18.         return result
  19.     return clocked


  20. @clock
  21. def snooze(seconds):
  22.     time.sleep(seconds)


  23. @clock
  24. def factorial(n):
  25.     return 1 if n < 2 else n*factorial(n-1)


  26. if __name__ == '__main__':
  27.     print('*' * 40, 'Calling snooze(.123)')
  28.     snooze(.123)
  29.     print('*' * 40, 'Calling factorial(6)')
  30.     print('6! =', factorial(6))
复制代码



这个程序运用了clock装饰器,输出函数运行所花的时间。
输出结果如下:
**************************************** Calling snooze(.123)
[0.12480021s] snooze(0.123)-> None
**************************************** Calling factorial(6)
[0.00000000s] factorial(1)-> 1
[0.00000000s] factorial(2)-> 2
[0.00000000s] factorial(3)-> 6
[0.00000000s] factorial(4)-> 24
[0.00000000s] factorial(5)-> 120
[0.00000000s] factorial(6)-> 720
6! = 720
为什么后边调用factoria()函数时,运行时间都是0呢?
我也尝试了修改保留小数点后的位数,可是结果还是一样的。
调用snooze()函数时,运行时间却没问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-3 07:36:04 | 显示全部楼层
  1. **************************************** Calling snooze(.123)
  2. [0.13485169s] snooze(0.123)-> None
  3. **************************************** Calling factorial(6)
  4. [0.00000000s] factorial(1)-> 1
  5. [0.00033832s] factorial(2)-> 2
  6. [0.00042677s] factorial(3)-> 6
  7. [0.00048351s] factorial(4)-> 24
  8. [0.00054073s] factorial(5)-> 120
  9. [0.00059819s] factorial(6)-> 720
  10. 6! = 720
复制代码


没问题啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-3 16:14:46 | 显示全部楼层

那就奇怪了,我运行出来的结果都是0秒。
不过我修改了 t0 = time.time()这个语句
t0 = time.perf_counter()
下边的elapsed也都修改了,执行后就好了,
不知道是什么原因?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-23 01:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表