第一种:

import time

def time_me(fn): #fn 是要修饰/修改 的函数

def _wrapper(*args, **kwargs): #这个 _wrapper(*args, **kwargs) 则代指fn, *args 代表一般变量参数, **kwargs代表 字典,哈希等参数

start = time.perf_counter()

fn(*args, **kwargs)

print ("%s cost %s second"%(fn.__name__, time.perf_counter() - start))

return _wrapper

#这个装饰器可以在方便地统计函数运行的耗时。

#用来分析脚本的性能是最好不过了。

#这样用:

@time_me() 这里 没有指定

def test(x, y):

time.sleep(0.1)

@time_me()

def test2(x):

time.sleep(0.2)

test(1, 2)

test2(2)

第二种:

import time

import functools

def time_me(info="used"):

def _time_me(fn):

@functools.wraps(fn) #转化为输入函数

def _wrapper(*args, **kwargs): #*args, **kwargs 代指所有 输入函数的参数

start = time.perf_counter()

fn(*args, **kwargs)

print("%s %s %s"%(fn.__name__, info, time.perf_counter() - start), "second")

return _wrapper

return _time_me

#应用

@time_me() #添加修饰器,就是函数嵌套了函数,中间加了一些功能和执行内容,而不需要 修改 test() 函数的内容

def test(x, y):

time.sleep(0.1)

@time_me("cost") #添加修饰器

def test2(x):

time.sleep(0.2)

test(1, 2)

test2(2)

image.png

第三种改进版:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from __future__ import division

from __future__ import unicode_literals

import sys,time,datetime,functools

#info

__author__ = ''

__email__ = 'xxx@xxx.com'

__version__ = '0.0.1'

__status__ = 'Dev'

def time_me(info="used"):

def _time_me(fn):

@functools.wraps(fn) #转化为输入函数

def _wrapper(*args, **kwargs): #*args, **kwargs 代指所有 输入函数的参数

if sys.version[0]=="3":

start = time.perf_counter()

else:

start = time.clock()

fn(*args, **kwargs)

if sys.version[0]=="3":

end = time.perf_counter()

else:

end = time.clock()

print("%s %s %s"%(fn.__name__, info, str(datetime.timedelta(seconds = end - start))))

return _wrapper

return _time_me

#应用

@time_me() #添加修饰器,就是函数嵌套了函数,中间加了一些功能和执行内容,而不需要 修改 test() 函数的内容

def test(x, y):

time.sleep(0.3)

@time_me("cost") #添加修饰器,给个参数cost

def test2(x):

time.sleep(0.4)

test(1, 2)

test2(2)

输出为:

image.png

第四种 在实际应用时 发现会报错

TypeError: cannot unpack non-iterable NoneType object

自己用在某个函数上,这个函数输入和返回都不止 一个参数

@time_me()

def bam2fa(bam,lst,fz=1000,rz=100,pb=0.66,if="ins",if2="hr",sf=False):

pass

return list, dict, list

查询后发现 原因是:

TypeError: cannot unpack non-iterable NoneType object

报错的原因是函数返回值得数量不一致,查看函数返回值数量和调用函数时接收返回值的数量是不是一致,修改一致即可

发觉是是自己对装饰器理解不到位,逐

参考了这里,发现 之前的例子里少了 return func(*args, **kwargs) 返回这个原始函数func

Python 函数装饰器

image.png

看完了这篇才明白

如何理解Python装饰器?

如下图中

fn(*args, **kwargs) 放在了 获取时间的中间,但是我的函数是有返回值的

image.png

完善版本(支持具有返回值的函数)

8881910.png

'''

import sys,time,datetime,functools,logging

#logging 用于输出日志

def main():

#logging 设置

LOG_FORMAT = "%(asctime)s %(name)s %(levelname)s %(pathname)s %(message)s "#配置输出日志格式

DATE_FORMAT = '%Y-%m-%d %H:%M:%S' #配置输出时间的格式,注意月份和天数不要搞乱了

logging.basicConfig(level=logging.DEBUG,format=LOG_FORMAT,datefmt = DATE_FORMAT,filename=r"logging.log" )

'''

def time_me(info="used"):

def _time_me(func):

if sys.version[0]=="3": #获得python版本号,截取第一个字符,2.7就是2 ,3.8就是3

start = time.perf_counter() #python3 中使用perf_counter()

else:

start = time.clock() #python2 中使用clock()

@functools.wraps(func) #效果是保持当前装饰器去装饰的函数的 __name__ 的值不变;

#函数的函数名即 __name__默认被装饰器改变为_wrapper,但是当存在多个修饰器时,重名会发生错误,

def _wrapper(*args, **kwargs): #*args, **kwargs 代指所有 输入函数的参数

return func(*args, **kwargs) #这里等于执行了一次这个函数

if sys.version[0]=="3": #获得python版本号,截取第一个字符,2.7就是2 ,3.8就是3

end = time.perf_counter()

else:

end = time.clock()

#logging.info("%s %s %s\n"%(func.__name__, info, str(datetime.timedelta(seconds = end - start)))) #这里可以替换 logging 日志,func.__name__ 是该函数的名字,也可以自己在函数中设置 __name__="xxx"

print("%s %s %s"%(fn.__name__, info, str(datetime.timedelta(seconds = end - start))))

return _wrapper

return _time_me

args表示任何多个无名参数,它是一个tuple;kwargs表示关键字参数,它是一个dict。并且同时使用args和kwargs时,必须args参数列要在*kwargs前,像foo(a=1, b='2', c=3, a', 1, None, )这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”。

获得的启示:编写函数时,参数中字典类型的放在后面 func() 的后面 ,如 func( arg,tuple,list,dict)

python计算执行时间的函数_[python] 统计函数运行时间相关推荐

  1. 基于python计算包含贝塞尔函数的积分

    基于python计算圆形回线瞬变电磁场 难点是贝塞尔函数的求解,目前python无该函数,但在scipy.special中,封装了如下Bessel函数. 这些不同类型的Bessel函数,具有相似的输入 ...

  2. python标准库math用来计算平方根的函数_《Python程序设计方案》题库

    < Python 程序设计>题库 一.填空题 第一章 基础知识 1 . Python 安装扩展库常用的是 _______ 工具.( pip ) 2 . Python 标准库 math 中用 ...

  3. python标准库math用来计算平方根的函数_《Python程序设计》试试题题库

    WORD 格式可编辑 < Python 程序设计>题库 一.填空题 第一章 基础知识 1 . Python 安装扩展库常用的是 _______ 工具.( pip ) 2 . Python ...

  4. 用python计算圆的面积_用Python计算大圆距

    用python计算圆的面积 The shortest distance between two locations on the surface of Earth (or any planet) is ...

  5. python计算文件md5值_用python 正确计算大文件md5 值

    python 计算文件的md5值很方便,但如果只是简单的把文件都入到内存中,大文件会导致问题,一般采用切片的方式分段计算,下面的几个函数可以很好的解决这个问题. 使用 hashlib import h ...

  6. python数字转日期函数_【转】Python 日期和时间

    本文转自:http://www.runoob.com/python/python-date-time.html Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Pytho ...

  7. python计算时间差的方法_如何计算时间差,用Python算法的话

    这篇文章主要介绍了python计算时间差的方法,实例分析了Python时间操作的相关模块与技巧,需要的朋友可以参考下 本文实例讲述了python计算时间差的方法.分享给大家供大家参考.具体分析如下: ...

  8. python 通达信公式函数_通达信zig函数的python实现

    通达信zig函数的python实现 代码 # coding: utf-8 """ Created on Sat Jan 05 18:53:39 2019 http://w ...

  9. python计算平均绩点_【python】以五分制绩点为基础的绩点计算器,可计算学分加权平均...

    [python]以五分制绩点为基础的绩点计算器,可计算学分加权平均 [python]以五分制绩点为基础的绩点计算器,可计算学分加权平均分和平均学分绩点 目录 一.以五分制绩点为基础的绩点计算器 1.1 ...

最新文章

  1. 三级工作台抽奖出啥_【早早聊】如何落地一体化运营工作台
  2. machine learn in python 第二章2.1.1
  3. C++描述杭电OJ 2010.水仙花数 ||
  4. vim中实现javascript代码自动完成功能
  5. 最短路 HDU - 2544
  6. easyui下拉框用法
  7. xcode里面找不到头文件
  8. linux内核被加载的过程
  9. 一文弄懂特征缩放(归一化/正则化)
  10. 硬盘分区后的逻辑结构
  11. LY.JAVA.DAY12.Scanner
  12. 2018年下半年《软件评测师》上午试卷及答案
  13. python与审计底稿关系_干货!审计底稿,六大禁忌
  14. 使用EXCEL进行数据分组分析法
  15. 【生活】深圳驾考经历
  16. webpack打包vue项目之后dist文件夹在本地跑起来
  17. Open Feign调用出现CRTL CODE 31两种解决方案
  18. CodeForces - 348A E - Mafia
  19. php为什么被叫做拍黄片 故事起因
  20. 计算机的工作原理是二进制原理吗,计算机是怎么通过二进制原理来工作的?

热门文章

  1. flowable实战(十五)关于流程设计器 bpmn.js与vue的整合
  2. VS Code 常规配置和一些插件 - JavaScript
  3. 学习笔记之数据可视化(二)——页面布局(中)
  4. linux下远程登录如何退出,Ubuntu 中rdesktop如何切换和退出远程桌面
  5. Python bytes 函数 - Python零基础入门教程
  6. jq之$(“a[target=‘_blank‘]“)
  7. mysql ssh错误_通过SSH隧道连接时,MySQL访问被拒绝错误
  8. python下标从0开始_从零学Python之入门(三)序列
  9. java对外发布接口文档_java之接口文档规范
  10. 终端执行php,PHP命令行执行PHP脚本的注意事项总结