Python: 使用装饰器“@”取得函数执行时间

class A():

Python: 使用装饰器“@”取得函数执行时间 - oldJ的学习笔记 - 博客频道 - CSDN.NET

Python: 使用装饰器“@”取得函数执行时间

分类: Python 2009-10-14 12:53 752人阅读 评论(0) 收藏 举报

Python中可以使用装饰器对函数进行装饰(或说包装),利用这个特性,可以很方便、简洁地解决一些问题,比如获得函数执行时间的问题。

首先,我们定义一个函数,如下:


[python] view plaincopyprint?

    def exeTime(func): 
        def newFunc(*args, **args2): 
            t0 = time.time() 
            print "@%s, {%s} start" % (time.strftime("%X", time.localtime()), func.__name__) 
            back = func(*args, **args2) 
            print "@%s, {%s} end" % (time.strftime("%X", time.localtime()), func.__name__) 
            print "@%.3fs taken for {%s}" % (time.time() - t0, func.__name__) 
            return back 
        return newFunc 

当然,不要忘了“import time”导入time模块。这个函数就可以用作我们计算函数执行时间的修饰器了。

接下来,我们就可以在需要计时的函数前一行引用它作为装饰,比如:


[python] view plaincopyprint?

    @exeTime 
    def foo(): 
        for i in xrange(10000000): 
            pass 

注意最上方的“@exeTime ”,装饰器的语法以“@”开头,接着是装饰函数,在本例中为“exeTime”。这时,执行函数foo,装饰器就会在控制台打印出这个函数的执行时间了。

完整代码如下:


[python:collapse] + expand sourceview plaincopyprint?

    # -*- coding: utf-8 -*- 
    import time 
     
    # --exeTime 
    def exeTime(func): 
        def newFunc(*args, **args2): 
            t0 = time.time() 
            print "@%s, {%s} start" % (time.strftime("%X", time.localtime()), func.__name__) 
            back = func(*args, **args2) 
            print "@%s, {%s} end" % (time.strftime("%X", time.localtime()), func.__name__) 
            print "@%.3fs taken for {%s}" % (time.time() - t0, func.__name__) 
            return back 
        return newFunc 
    # --end of exeTime 
    
    @exeTime 
    def foo(): 
        for i in xrange(10000000): 
            pass 
     
    if __name__ == "__main__": 
        foo() 

在笔者电脑上的运行结果为:

@13:12:27, {foo} start
@13:12:27, {foo} end
@0.203s taken for {foo}

当然,上面只是一个很简单的示例,事实上,本例中的装饰器exeTime不仅可以装饰类似上面“foo”这样不带参数的函数,也能装饰带任意参数的函数,甚至还可以装饰类的方法,用法与上面是一样的。

除了计算运行时间外,装饰器还可以有很多用途,比如记录运行日志等,更多的用途等待更多的朋友去发掘。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库07

索引 索引是一种单独的物理层面的数据结构,其作用是用于加速查询 mysql把数据存储到硬盘中,硬盘读写速度非常慢 一个应用程序,本质上就是对数据进行增删改查 一旦数据量比较大时,硬盘的响应速度变慢,给用户的感觉应用程…

ODT .NET 详解之 SqlDataSource 访问 Oracle

前一篇博文呢,介绍了如何搭配好 Oracle Developer Tools for Visual Studio .NET 的使用环境, 这一篇博文的话就会重点来介绍一下如何通过使用 SqlDataSource 这个控件来访问 Oracle 数据库了, 其实只要环境搭配好了,那么这一篇博…

springboot+thymeleaf+pageHelper带条件分页查询

html层 <div><a class"num"><b th:text"共 ${result.resultMap[pages]} 页"></b></a><a class"num" th:if"${result.resultMap[hasPreviousPage]} true" th:href"{/report/receivePage?cur…

Linux文件、目录权限及常用命令

############################################# 一、权限                 #############################################1、r 可读 42、w 可写 23、x 可运行 1##…

谷歌:不守规矩的“顽童”

十几岁&#xff0c;对于人类来说&#xff0c;是敏感多虑且叛逆的青春期&#xff0c;而十几岁对于一个企业则意味着扎实经营基础的黄金阶段。谷歌&#xff08;Google&#xff09;&#xff0c;这个十年来互联网领域最大的赢家&#xff0c;正是这个即将步入金钗之年的“顽童”&…

bloom filter

今天的文章和大家一起来学习大数据领域一个经常用到的算法——布隆过滤器。如果看过《数学之美》的同学对它应该并不陌生&#xff0c;它经常用在集合的判断上&#xff0c;在海量数据的场景当中用来快速地判断某个元素在不在一个庞大的集合当中。它的原理不难&#xff0c;但是设…

数据描述

数据描述 1、静态数据 本系统支持用户个人信息存储以及旅游地点、天数、花费金额、景点的推荐存储。因此&#xff0c;本系统需要存储数据库部分信息。 2、动态数据 用户登录信息 用户搜索结果 用户个人信息 旅游分享的攻略 用户个人留言 用户偏好信息 3数据库描述&#xff1a;数…

样式的使用(七)

在自定义组件中使用运行时样式 1、css文件 /* ../assets/CustomComponentStyles.css */ namespace s "library://ns.adobe.com/flex/spark"; namespace mx "library://ns.adobe.com/flex/halo"; .specialStyle{font-size:24;font-weight:bold; } 记得要把文…

skiplist原理与实现

今天继续介绍分布式系统当中常用的数据结构&#xff0c;今天要介绍的数据结构非常了不起&#xff0c;和之前介绍的布隆过滤器一样&#xff0c;是一个功能强大原理简单的数据结构。并且它的缺点和短板更少&#xff0c;应用更加广泛&#xff0c;比如广泛使用的Redis就有用到它。 …

JavaScript与HTML交互——事件

JavaScript和HTML的交互是通过事件实现的。JavaScript采用异步事件驱动编程模型&#xff0c;当文档、浏览器、元素或与之相关对象发生特定事情时&#xff0c;浏览器会产生事件。如果JavaScript关注特定类型事件&#xff0c;那么它可以注册当这类事件发生时要调用的句柄。 事件流…

ORMMySQL

概念: ORM&#xff1a;对象关系映射 , 全拼 Object-Relation Mapping ,是一种为了解决面向对象与关系数据库存在的互不匹配现象的技术。主要实现模型对象到关系型数据库数据的映射.比如&#xff1a;把数据库表中每条记录映射为一个模型对象 使用原因: 若不使用ORM框架实现一个应…

实现WM下删除最后一条匹配的通话记录

代码很简单就是操作EDB数据库&#xff0c;先按开始时间降序排序&#xff0c;然后删除第一条匹配的记录。 1 boolDeleteLastCallLogByNumber(LPCTSTR lpszNumber)2 {3 typedef enum4 {5 CT_Reserved0,6 CT_Outgoing1,7 CT_Connected2,8 CT_Ended4,9 CT_Voice_Data8,10 CT_Roam16…

std::string中的反向迭代器rbegin()和rend()

在std::string中&#xff0c;有个接口是rbegin()和rend()&#xff0c;分别表示string字符串的倒数第一个字符和正数第一个字符&#xff1b; rbegin()&#xff1a;表示string字符串的倒数第一个字符 rend()&#xff1a;表示string字符串的正数第一个字符 分为普通的iterator和…

【转】[教程] CSS入门3:如何插入CSS样式

http://bbs.blueidea.com/forum.php?modviewthread&tid2524742 转载于:https://www.cnblogs.com/lzhitian/archive/2012/11/25/2787164.html

5.spiders(文件夹)

一、基础知识 1. Spiders 文件夹 用于编写爬虫规则&#xff0c;可以在已有的___init__.py文件中编写具体的爬虫规则但是实际开发中可能有多个爬虫规则&#xff0c;所以建议一个爬虫规则用一个文件表示&#xff0c;这样便于维护和管理 2. 代码 # -*- coding: utf-8 -*- import s…

unlink(file_name)

官方描述&#xff1a; unlink的文档是这样描述的: unlink() deletes a name from the filesystem. If that name was the last link to a file and no processes have the file open the file is deleted and the space it was using is made available for reuse. …

sql server行级锁,排它锁,共享锁的使用

一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读 A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修…

日常学习笔记(1)

2019/03/19 21:12 1.函数&#xff1a;numpy.linspace(start,stop,num50,endpointTrue,retstepFalse,dtypeNone)参数&#xff1a; start&#xff1a;scalar类型&#xff08;个人理解是标量的意思&#xff0c;这不是一个具体的数据类型&#xff0c;而是指某一些数据类型&#xff…

淘宝开发平台知识点一,入门指南

App Key&#xff1a;12038991 App Secret&#xff1a;bb6e1d29db744ed023bfed6a3af6f4f3 1,测试环境下&#xff0c;获取授权码&#xff0c;只有十分钟 http://open.taobao.com/isv/authorize.php?appkey12038991 2&#xff0c;http://container.api.tbsandbox.com/container?…

【转】Linux 下修改Tomcat使用的JVM内存大小

转自 &#xff1a;http://blog.csdn.net/sully2008/article/details/6457570 我的服务器的配置&#xff1a;# OS specific support. $var _must_ be set to either true or false.JAVA_OPTS"-Xms1024m -Xmx4096m -Xss1024K -XX:PermSize512m -XX:MaxPermSize2048m"…