Python Timer和TimerFPS计时工具类

 更新时间:2022年03月17日 14:20:34   作者:小锋学长生活大爆炸  
这篇文章主要介绍了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()

效果

到此这篇关于Python Timer和TimerFPS计时工具类的文章就介绍到这了,更多相关Python 计时工具类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python numpy查询定位赋值数值所在行列

    python numpy查询定位赋值数值所在行列

    这篇文章主要介绍了python numpy查询定位赋值数值所在行列,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • python多线程并发实例及其优化

    python多线程并发实例及其优化

    这篇文章主要介绍了python多线程并发实例及其优化,threading是扩展模块,在thread的基础上进行了封装及改进。所以只需要使用threading这个模块就能完成并发的测试,需要的朋友可以参考下
    2019-06-06
  • Pytorch dataloader在加载最后一个batch时卡死的解决

    Pytorch dataloader在加载最后一个batch时卡死的解决

    这篇文章主要介绍了Pytorch dataloader在加载最后一个batch时卡死的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • 浅析python 定时拆分备份 nginx 日志的方法

    浅析python 定时拆分备份 nginx 日志的方法

    本文给大家分享python 定时拆分备份 nginx 日志的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-04-04
  • Python+Selenium实现在Geoserver批量发布Mongo矢量数据

    Python+Selenium实现在Geoserver批量发布Mongo矢量数据

    这篇文章主要为大家详细介绍了如何利用Python+Selenium实现在 Geoserver批量发布来自Mongo中的矢量数据,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-07-07
  • python3 实现函数写文件路径的正确方法

    python3 实现函数写文件路径的正确方法

    今天小编就为大家分享一篇python3 实现函数写文件路径的正确方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python线程的几种创建方式详解

    python线程的几种创建方式详解

    这篇文章主要介绍了python线程的几种创建方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python的streamplot使用及说明

    Python的streamplot使用及说明

    这篇文章主要介绍了Python的streamplot使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • python入门游戏之井字棋实例代码

    python入门游戏之井字棋实例代码

    python井字棋游戏虽然看上去非常简陋,但是却非常值得学习,下面这篇文章主要给大家介绍了关于python入门游戏之井字棋的相关资料,需要的朋友可以参考下
    2021-11-11
  • Django执行python manage.py makemigrations报错的解决方案分享

    Django执行python manage.py makemigrations报错的解决方案分享

    相信用过很多Django makemigrations的人都会遇到过makemigrations时会发生报错,下面这篇文章主要给大家介绍了关于Django执行python manage.py makemigrations报错的解决方案,需要的朋友可以参考下
    2022-09-09

最新评论