一个Python计时函数,方便查看当前时间、运行总时间、距离上次运行间隔时间。
不需要定义全局变量,相关数据都用装饰器存储在函数对象的属性中。
主要在机器学习训练中用到。以前写的,现在有的看不懂了,有空的话以后添加一些注释。
# -*- coding: utf-8 -*-
"""
计时函数,使用自定义装饰器
无需外部变量,将printTime()放在需要计时的位置
输出当前时间,如果不是首次运行函数,再输出距离上次运行时间和运行总时间。
经测试,有时模块不重新加载,需要在待测试程序的开头加上printTime(0)以重置时间。
printTime(1)不输出,返回自从printTime(0)以来的总时间
"""
import time
def sayTime(sec,space=1):
s=''
realsec=sec
if sec>3600:
s+='%dh '%(sec/3600)
sec%=3600
if sec>60:
s+='%dm '%(sec/60)
sec%=60
if sec>1:
s+='%ds'%sec
sec-=int(sec)
if realsec<60:
if realsec>1:s+=' '
s+='%dms'%(sec*1000)
if space==0:
s=s.replace(' ','')#删除空格
return s
class CallingTimer(object):
def __init__ (self, func):
self.func = func
self.count = 0
self.first_time = time.time()
def __call__ (self, *args, **kwargs):
if args and args[0]==0:
self.count = 1
self.first_time = time.time()
self.last_time=time.time()
# args=()
else:
self.count += 1
if self.count>1:
self.interval_time=time.time()-self.last_time
self.last_time=time.time()
self.used_time=time.time()-self.first_time
return self.func(*args, **kwargs)
@CallingTimer
def printTime(*args):
# print(*args)
# tags=['now','start timing','interval','used']
# tags=list(map(lambda x:x.upper(),['now','start timing','interval','used']))
tags=['当前时间','开始计时','距离上次','已运行']
time_str=tags[0]+': %d.%02d.%02d %02d:%02d:%02d'%time.localtime()[:6]
if printTime.count>1:
time_str+=', '+tags[2]+': '+sayTime(printTime.interval_time)+', '+tags[3]+': '+sayTime(printTime.used_time)
else:
time_str+=' ('+tags[1]+')'
if args and args[0]==1:
if printTime.count>1:
return sayTime(printTime.used_time,0)
else:
print(time_str)
if __name__=='__main__':
printTime()
time.sleep(0.1)
printTime()
time.sleep(0.2)
printTime()
print('--reset--')
printTime(0)
time.sleep(0.1)
printTime()
time.sleep(1.2)
printTime()
time.sleep(0.3)
printTime(1)
time.sleep(0.2)
print(printTime(1))
输出
当前时间: 2024.03.06 12:20:45 (开始计时)
当前时间: 2024.03.06 12:20:45, 距离上次: 100ms, 已运行: 100ms
当前时间: 2024.03.06 12:20:45, 距离上次: 200ms, 已运行: 301ms
--reset--
当前时间: 2024.03.06 12:20:45 (开始计时)
当前时间: 2024.03.06 12:20:45, 距离上次: 100ms, 已运行: 100ms
当前时间: 2024.03.06 12:20:46, 距离上次: 1s 200ms, 已运行: 1s 301ms
1s801ms
原文章于 2024-03-06 12:27:26 修改
2025.06.20晚发现被设置为vip免费,改回免费。