使用装饰器记录函数体运行时间:

import time
import wraptclass Timing:timings = {}enabled = Falsedef __init__(self, enabled=True):Timing.enabled = enableddef __str__(self):return "Timing"__repr__ = __str__@classmethoddef timeit(cls, level=0, func_name=None, cls_name=None, prefix="[Method] "):@wrapt.decoratordef wrapper(func, instance, args, kwargs):if not cls.enabled:return func(*args, **kwargs)if instance is not None:instance_name = "{:>18s}".format(instance.__class__.__name__)else:instance_name = " " * 18 if cls_name is None else "{:>18s}".format(cls_name)_prefix = "{:>26s}".format(prefix)try:_func_name = "{:>28}".format(func.__name__ if func_name is None else func_name)except AttributeError:str_func = str(func)_at_idx = str_func.rfind("at")_dot_idx = str_func.rfind(".", None, _at_idx)_func_name = "{:>28}".format(str_func[_dot_idx+1:_at_idx-1])_name = instance_name + _prefix + _func_name_t = time.time()rs = func(*args, **kwargs)_t = time.time() - _ttry:cls.timings[_name]["timing"] += _tcls.timings[_name]["call_time"] += 1except KeyError:cls.timings[_name] = {"level": level,"timing": _t,"call_time": 1}return rsreturn wrapper@classmethoddef show_timing_log(cls, level=2):print()print("=" * 110 + "\n" + "Timing log\n" + "-" * 110)if cls.timings:for key in sorted(cls.timings.keys()):timing_info = cls.timings[key]if level >= timing_info["level"]:print("{:<42s} :  {:12.7} s (Call Time: {:6d})".format(key, timing_info["timing"], timing_info["call_time"]))print("-" * 110)@classmethoddef disable(cls):cls.enabled = False

使用和测试:

if __name__ == '__main__':class Test:timing = Timing()def __init__(self, rate):self.rate = rate@timing.timeit()def test(self, cost=0.1, epoch=3):for _ in range(epoch):self._test(cost * self.rate)@timing.timeit(prefix="[Core] ")def _test(self, cost):time.sleep(cost)class Test1(Test):def __init__(self):Test.__init__(self, 1)class Test2(Test):def __init__(self):Test.__init__(self, 2)class Test3(Test):def __init__(self):Test.__init__(self, 3)test1 = Test1()test2 = Test2()test3 = Test3()test1.test()test2.test()test3.test()test1.timing.show_timing_log()runfile('/root/2half/Util/Timing.py', wdir='/root/2half/Util')
()
==============================================================================================================
Timing log
--------------------------------------------------------------------------------------------------------------Test1                   [Core]                        _test :     0.3006141 s (Call Time:      3)Test1                 [Method]                         test :     0.3007839 s (Call Time:      1)Test2                   [Core]                        _test :     0.6010602 s (Call Time:      3)Test2                 [Method]                         test :     0.6012352 s (Call Time:      1)Test3                   [Core]                        _test :     0.9015043 s (Call Time:      3)Test3                 [Method]                         test :      0.901685 s (Call Time:      1)
--------------------------------------------------------------------------------------------------------------

Python学习:装饰器使用,timeit()记录程序运行在哪里,耗时多少相关推荐

  1. python 日志 装饰器_【Python】装饰器实现日志记录

    好的日志对一个软件的重要性是显而易见的.如果函数的入口都要写一行代码来记录日志,这种方式实在是太低效了,但一直没有找到更好的方法.后来用python写一些软件,了解到python的装饰器功能时,突然人 ...

  2. python学习-装饰器(可变参装饰器、完善装饰器)

    文章目录 可变参装饰器 完善装饰器 可变参装饰器 *args表示任何多个无名参数,它是一个tuple:**kwargs表示关键字参数,它是一个dict. 并且同时使用*args和**kwargs时,必 ...

  3. python学习-装饰器(decorator)

    文章目录 装饰器 普通装饰器 装饰器带参数 类装饰器 类方法装饰器 装饰器 装饰器(Decorators)是 Python 的一个重要部分.简单地说:他们是修改其他函数的功能的函数. 普通装饰器 个人 ...

  4. python装饰器函数-Python精进-装饰器与函数对象

    本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...

  5. Python 函数装饰器

    装饰器(Decorators)是 Python 的一个重要部分.简单地说:他们是修改其他函数的功能的函数.他们有助于让我们的代码更简短,也更Pythonic(Python范儿).大多数初学者不知道在哪 ...

  6. 《是碰巧还是执着?python所阅读的每一场知识点,唯一的共同点就是——参赛选手中,有详解Python的装饰器!》

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  7. Python的装饰器

    详解Python的装饰器 本文源码 https://github.com/tobyqin/python_decorator Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都 ...

  8. python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景

    装饰器的应用场景附加功能 数据的清理或添加:函数参数类型验证 @require_ints 类似请求前拦截数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改为函数提供额外的数据 moc ...

  9. python装饰器函数-python函数装饰器

    什么是装饰器 装饰器是一个可调用的对象,其参数是另一个函数(被装饰的函数).装饰器可能会: 1,处理被装饰的函数,然后把它返回 2,将其替换成另一个函数或者对象 若有个名为decorate的装饰器,则 ...

最新文章

  1. Java遍历Map对象的四种方式
  2. 设置服务器系统的远程登录数量,设置服务器远程登录用户数量
  3. Dynamips和Vmware完成CCVP试验(8)
  4. 强调团体与配合的jinbiguandan
  5. python excel详解_Python - excel 详解
  6. 基于Monte Carlo方法的2048 A.I.
  7. 十大经典排序算法1(Python版本)
  8. Linux 线程到底是什么(比喻+图解)
  9. Microsoft C++ 异常: 内存位置处的 std::bad_alloc问题解决办法
  10. @interface自定义注解
  11. 最新手机号段归属地数据库 高性能dat解析
  12. 验证码~正则表达式【整理汇总】
  13. 图像预处理流程与方法
  14. 银行业务分析(数据整合)
  15. java计算机毕业设计ssm+vue酒店VIP客户管理系统
  16. Mc1.16forge官混教程/教补-#3 物品材质覆盖注意要点[分支1]
  17. Hyper-v安装和使用
  18. 虚拟机2012搭建DNS服务器,Windows Server2012 安装配置DNS服务器方法详解
  19. n1怎么进入线刷模式_OPPO N1怎么进Recovery模式 两种OPPO N1进入Recovery模式方法
  20. Python 爬取QQ飞车手游赛道 or 宠物 图片

热门文章

  1. Mac解决终端显示乱码
  2. document write的用法
  3. 在Linux中某些程序无法运行,为何linux下的程序不能在windows下运行,不是“废话”那么简单...
  4. linux 分区_Linux文件系统、逻辑分区、物理分区
  5. jar 反编译_Java加密jar包流程
  6. python出现的次数最多的元素_Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算...
  7. 根目录访问php 404,nginx配置后只有根目录首页index.php能访问,其他页面404
  8. 【uniapp】CSS3 的 calc() 函数使用表达式动态计算
  9. mybatis mysql 分表_Mybatis的分表实战
  10. java乌龟_java用swing画可以行走的乌龟