python计算执行时间的函数_[python] 统计函数运行时间

第一种:

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)

73edd03b914a

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)

输出为:

73edd03b914a

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 函数装饰器

73edd03b914a

image.png

看完了这篇才明白

如何理解Python装饰器?

如下图中

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

73edd03b914a

image.png

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

73edd03b914a

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)

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

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

相关文章

arthas 排查内存溢出_Java 应用线上问题排查思路、常用工具小结

前言本文总结了一些常见的线上应急现象和对应排查步骤和工具。分享的主要目的是想让对线上问题接触少的同学有个预先认知,免得在遇到实际问题时手忙脚乱。毕竟作者自己也是从手忙脚乱时走过来的。只不过这里先提示一下。在线上应急过程中要记住,只有一个…

flutter listview 滚动到指定位置_Flutter 布局原理及实战

1. Flutter UI架构Flutter将视图数据抽象成为三个部分,即Widget树、Element树和RenderObject树。Widget树:控件的配置信息,不涉及渲染,更新代价极低。RenderObject树:真正的UI渲染树,负责渲染UI&#xff0c…

雷神开机logo更改_国产外星人雷神再发新品 911MT逐影者RTX2060光追游戏本评测

随着NVIDIA发布了笔记本20系显卡之后,宣示着全民进入了“RTX光线追踪时代”,各种新款的游戏也纷纷宣布支持“光线追踪”技术来吸引更多的玩家,似乎现在游戏本上没有个“RTX”贴纸就已经不好意思跟别人打招呼了。说到2019年的RTX新品&#xff…

AJAX框架衣柜内部布局,​最合理的衣柜内部布局解析,3大细节不容小觑

时常有业主或者朋友问小轻,最合理的衣柜内部布局应该是怎样的,确实这对于非业内人士一般都是不太清楚的,即使有的朋友已经有了丰富的生活经验,甚至是业内人士也不一定对此完全了解。那么到底最合理的衣柜内部布局是怎样的呢&#…

python爬取数据保存为csv时生成编号_将爬取到到数据以CSV格式存储

CSV文件存储 CSV,全称为Comma-Separated Values,中文可以叫做逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据。该文件是一个字符序列,可以由任意数目的记录组成,记录间以某种换行符分隔。每条记录由字段组成&…

博达3956交换机配置手册_网络设备维保浅谈之交换机维保

随着信息化的飞速发展,交换机作为信息流通的承载者,是应用最为广泛的网络设备之一,其作用不言而喻。因此,在日产使用中,要注意交换机这种核心的设备的维护与保养,以免引发故障。交换机运维需要注意哪些问题…

java cas原理_Java并发之原子变量及CAS算法-上篇

Java并发之原子变量及CAS算法-上篇编辑​概述本文主要讲在Java并发编程的时候,如果保证变量的原子性,在JDK提供的类中是怎么保证变量原子性的呢?。对应Java中的包是:java.util.concurrent.atomic包下。因为涉及到了CAS算法&#x…

node ajax validator,使用validator.js对字符串数据进行验证

validator.js是一个对字符串进行数据验证和过滤的工具库,同时支持Node端和浏览器端,github地址是https://github.com/chriso/validator.js主要API如下:验证APIcontains(str, seed)验证str中是否含有seedequals(str, comparison)验证是否相等i…

css span 右端对齐_CSS标准文档流

web页面的制作,是个“流”,像水流一样,必须从上往下,一点点的编织,不像画画,可以这个地方画一个,另一个地方画一个,随意而为。标准文档流的一些微观现象1. 空白折叠现象1)标签与标签…

composer升级_Composer 使用姿势与 Lumen 升级指南

Composer 使用姿势这里主要说说 composer.json 和 composer.lock 文件的作用。composer.jsoncomposer.json 文件包含了项目的依赖和其它的一些元数据,使用 JSON format 编写。当初次调用 composer install 时,Composer 会根据 composer.json 文件&#x…

服务器间传文件$d,基于OpenSSH+WinSCP完成Windows服务器之间的文件传输

背景经常会遇到在不同服务器之间传输文件,Linux和Linux之间用命令rsync, windows和linux之间普遍是有图形化界面的ftp软件,老黄平时用的比较多的是FileZilla。Windows和Windows之间的话,90%都是在一台机器复制,到另一台…

dbgrideh 为什么只一行_Mysql性能优化:为什么count(*)这么慢?

导读在开发中一定会用到统计一张表的行数,比如一个交易系统,老板会让你每天生成一个报表,这些统计信息少不了sql中的count函数。但是随着记录越来越多,查询的速度会越来越慢,为什么会这样呢?Mysql内部到底是…

jmeter 高并发测试报告_JMeter分布式测试

一、为什么要使用分布式测试按照一般的压力机配置,jmeter的GUI模式下(Windows),最多支持300左右的模拟请求线程,再大的话,容易造成卡顿、无响应等情况,这是限于jmeter其本身的机制和硬件配置。有时候为了尽量模拟业务场…

半圆阴影_六年级数学:怎么求阴影部分面积?正方形与半圆,割补法常考题

欢迎您来到方老师数学课堂,请点击上方蓝色字体,添加关注。所有的视频内容,全部免费,请大家放心关注,放心订阅。六年级数学:怎么求阴影部分面积?正方形与半圆,割补法常考题。大家先在…

c语言判断整数_用c++编写闰年的判断基础程序

其实c语言与c语言有太多共同的东西,学习过c语言再学习c语言就显得轻而易举。当然学过了c再去学习c语言也是有一些帮助的(但是个人不提倡先学习c在学c语言)。由于现在经常看见有关闰年的程序,风式各样,眼花缭乱,些许凌乱&#xff0…

cat日志 搜索_大日志,看我如何对付你

在服务器接口测试中,我们经常会和各种日志打交道。一旦测试时服务端出现了问题,而单凭服务端的日志又不能发现问题原因的时候,往往开发要向我们测试人员询问客户端这边的情况,希望看看我们能不能提供一些有用信息,如错…

加载gif动图_GIF生成神器——ScreenToGif

每次需要做一个动图展示时,总是感觉很头疼。截图吧,需要的图片太多;录视频吧,文件太大;做动图吧,太麻烦。今天推荐的这个软件或许能够解决大家这个困惑,今天推荐的是动图生成神器——ScreenToGi…

java 修改最大nio连接数_关于java流的几个概念:IO、BIO、NIO、AIO,有几个人全知道?...

关于同步、阻塞的知识我之前的文章有介绍,所以关于流用到这些概念与之前多线程用的概念一样。下面具体来看看java中的几种流IO/BIOBIO就是指IO,即传统的Blocking IO,即同步并阻塞的IO。这也是jdk1.4之前的唯一选择,依赖于ServerSocket实现&am…

python扫雷 广度优先_广度优先搜索(BFS)解题总结

定义 广度优先搜索算法(Breadth-First-Search),是一种图形搜索算法。 简单的说,BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点。 如果所有节点均被访问,则算法中止。 BFS同样属于盲目搜索。 一般用队…

python裁剪图片并保存_python – 如何从图像中剪切轮廓并将其保存到新文件中

大家好,这是我的第一个问题所以请保持温和.我有一个计算机视觉领域的项目,我是新的,我会很感激一些帮助.我有一个pcb的图像,我的(首先)任务是从背景中切断电路板并将其保存到新文件.如果结果只是没有灰色背景的普通pcb,那就没问题了. 我到目前为止尝试的是,首先使用阈值将图像转…