Python Timer和TimerFPS计时工具类
作者:小锋学长生活大爆炸 发布时间:2022-06-13 12:48:38
标签:Python,Timer,TimerFPS,计时,工具类
以下工具类代码来自开源项目pyslam
。
Timer
import cv2
class Colors(object):
'''
Colors class:reset all colors with colors.reset; two
sub classes fg for foreground
and bg for background; use as colors.subclass.colorname.
i.e. colors.fg.red or colors.bg.greenalso, the generic bold, disable,
underline, reverse, strike through,
and invisible work with the main class i.e. colors.bold
'''
reset='\033[0m'
bold='\033[01m'
disable='\033[02m'
underline='\033[04m'
reverse='\033[07m'
strikethrough='\033[09m'
invisible='\033[08m'
class fg:
black='\033[30m'
red='\033[31m'
green='\033[32m'
orange='\033[33m'
blue='\033[34m'
purple='\033[35m'
cyan='\033[36m'
lightgrey='\033[37m'
darkgrey='\033[90m'
lightred='\033[91m'
lightgreen='\033[92m'
yellow='\033[93m'
lightblue='\033[94m'
pink='\033[95m'
lightcyan='\033[96m'
class bg:
black='\033[40m'
red='\033[41m'
green='\033[42m'
orange='\033[43m'
blue='\033[44m'
purple='\033[45m'
cyan='\033[46m'
lightgrey='\033[47m'
class Printer(object):
@staticmethod
def red(*args, **kwargs):
print(Colors.fg.red, *args, **kwargs)
print(Colors.reset, end="")
@staticmethod
def green(*args, **kwargs):
print(Colors.fg.green, *args, **kwargs)
print(Colors.reset, end="")
@staticmethod
def blue(*args, **kwargs):
print(Colors.fg.blue, *args, **kwargs)
print(Colors.reset, end="")
@staticmethod
def cyan(*args, **kwargs):
print(Colors.fg.cyan, *args, **kwargs)
print(Colors.reset, end="")
@staticmethod
def orange(*args, **kwargs):
print(Colors.fg.orange, *args, **kwargs)
print(Colors.reset, end="")
@staticmethod
def purple(*args, **kwargs):
print(Colors.fg.purple, *args, **kwargs)
print(Colors.reset, end="")
@staticmethod
def yellow(*args, **kwargs):
print(Colors.fg.yellow, *args, **kwargs)
print(Colors.reset, end="")
@staticmethod
def error(*args, **kwargs):
print(Colors.fg.red, *args, **kwargs, file=sys.stderr)
print(Colors.reset, end="")
#timer_print = print
timer_print = Printer.cyan
class Timer:
def __init__(self, name = '', is_verbose = False):
self._name = name
self._is_verbose = is_verbose
self._is_paused = False
self._start_time = None
self._accumulated = 0
self._elapsed = 0
self.start()
def start(self):
self._accumulated = 0
self._start_time = cv2.getTickCount()
def pause(self):
now_time = cv2.getTickCount()
self._accumulated += (now_time - self._start_time)/cv2.getTickFrequency()
self._is_paused = True
def resume(self):
if self._is_paused: # considered only if paused
self._start_time = cv2.getTickCount()
self._is_paused = False
def elapsed(self):
if self._is_paused:
self._elapsed = self._accumulated
else:
now = cv2.getTickCount()
self._elapsed = self._accumulated + (now - self._start_time)/cv2.getTickFrequency()
if self._is_verbose is True:
name = self._name
if self._is_paused:
name += ' [paused]'
message = 'Timer::' + name + ' - elapsed: ' + str(self._elapsed)
timer_print(message)
return self._elapsed
用法
import Timer
timer = Timer(is_verbose=True)
timer.start()
# 此处是你的代码
timer.elapsed()
效果
TimerFps
在上面的基础上,再加上下面代码段:
import os
import numpy as np
import cv2
import math
class MovingAverage:
def __init__(self, average_width = 10, compute_sigma = False):
self._average_width = average_width
self._idx_ring = 0
self._average = 0
self._sigma2 = 0
self._is_init = False
self._is_compute_sigma = compute_sigma
self._one_over_average_width_min_one = 1./(average_width-1)
self._ring_buffer = np.zeros(average_width)
def init(self, initVal=None):
if initVal is None:
initVal = 0.
self._ring_buffer = np.full(self._average_width, initVal, dtype=np.float32)
self._average = initVal;
self._sigma2 = 0;
self._is_init = True;
def getAverage(self, new_val=None):
if not self._is_init:
self.init(new_val)
if new_val is None:
return self._average
averageOld = self._average
oldVal = self._ring_buffer[self._idx_ring]
self._average += (new_val - oldVal)/self._average_width
if self._is_compute_sigma:
self._sigma2 = self._sigma2 + self._one_over_average_width_min_one*(self._average_width*(averageOld*averageOld - self._average*self._average) - oldVal*oldVal + newVal*newVal)
self._ring_buffer[self._idx_ring] = new_val
self._idx_ring = (self._idx_ring + 1) % self._average_width
return self._average
def getSigma(self):
return math.sqrt(max(self._sigma2,0.))
class TimerFps(Timer):
def __init__(self, name='', average_width = 10, is_verbose = True):
super().__init__(name, is_verbose)
self.moving_average = MovingAverage(average_width)
def refresh(self):
elapsed = self.elapsed()
self.moving_average.getAverage(elapsed)
self.start()
if self._is_verbose is True:
dT = self.moving_average.getAverage()
name = self._name
if self._is_paused:
name += ' [paused]'
message = 'Timer::' + name + ' - fps: ' + str(1./dT) + ', T: ' + str(dT)
timer_print(message)
用法
import TimerFps
timer = TimerFps(name='')
timer.start()
# 这里是你的代码
timer.refresh()
效果
来源:https://xfxuezhang.blog.csdn.net/article/details/122407412
0
投稿
猜你喜欢
- #!/usr/bin/env pythonimport sys,timefrom socket import socketdef read_
- 一、访问者模式(Visitor Pattern)数据结构中保存着许多元素,当我们希望改变一种对元素的处理方式时,要避免重复的修改数据结构。那
- sysdate+(5/24/60/60) 在系统时间基础上延迟5秒 sysdate+5/24/60 在系统时间基础上延迟5分钟 sysdat
- SQL Server的以前版本在跟踪对象相关性方面做的并不好。原因是所有的对象相关性都是由对象ID来跟踪的,这意味着对象一开始就必须存在。但
- 废话不多说,直接上代码吧!import threadingimport osclass Find(threading.Thread): #搜
- 昨天在网上看到一个防采集软件,说采集只访问当前网页,不会访问网页的图片、JS等,今天突然想到,通过动态程序和Js访问分别记录访问者的IP,然
- 这篇文章主要介绍了python列表推导式入门学习解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- #coding:utf-8 #批量修改文件名 import os import re import datetime re_st = r
- 1. 你必须有自己的服务器,可以在服务器上建立站点。2. 域名管理里 你的域名必须支持泛解析。(现在好像除了 双线双I
- close方法可以释放一个连接的资源,但是不是立即释放,如果想立即释放,那么在close之前使用shutdown方法shut_rd() --
- 1. 用qt designer编写主窗体,窗体类型是MainWindow,空白窗口上一个按钮。并转换成mainWindow.py# -*-
- OK,首先写一个python socket的server段,对开放三个端口:10000,10001,10002.krondo的例子中是每个s
- 一、正则表达式概述 如果原来没有使用过正则表达式,那么可能对这个术语和概念会不太熟悉。不过,它们并不是您想象的那么新奇。请回想一下在硬盘上是
- 前言面向对象编程对初学者来说不难理解但很难应用,虽然我们为大家总结过面向对象的三步走方法(定义类、创建对象、给对象发消息),但是说起来容易做
- 基本命令显示版本信息pip -V安装指定包pip install <packages>pip install -i 'h
- 年前接到QCon的邀请,颇感意外。在我的印象里,QCon大会是后端开发工程师和架构师的技术大会。后来去QCon大会的官网搜索了下,发现原来Q
- 在平常的一些的小规模的数据的过滤、清洗过程中使用最多的就是正则表达式,但是随着数据规模的增大,正则表达式就显得有些心有余力不足了。正则表达式
- 以查询前20到30条为例,主键名为id 方法一: 先正查,再反查 select top 10 * from (select top 30 *
- 最近对H1的讨论很多(在文章内容页中),大致有以下两种情况:H1应该用于文章的标题上H1应该用于站点的标题上相信大多数人都偏向第一种方式:用
- 安装通过 pip 安装 Beautiful Soup 模块:pip install beautifulsoup4 。 还可以使用 PyCha