Python?Timer和TimerFPS計(jì)時(shí)工具類
以下工具類代碼來自開源項(xiàng)目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
在上面的基礎(chǔ)上,再加上下面代碼段:
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()
效果

到此這篇關(guān)于Python Timer和TimerFPS計(jì)時(shí)工具類的文章就介紹到這了,更多相關(guān)Python 計(jì)時(shí)工具類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python高級(jí)搜索實(shí)現(xiàn)高效搜索GitHub資源
這篇文章主要為大家介紹了python高級(jí)搜索來高效搜索GitHub,從而高效獲取所需資源,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
自定義Django Form中choicefield下拉菜單選取數(shù)據(jù)庫內(nèi)容實(shí)例
這篇文章主要介紹了自定義Django Form中choicefield下拉菜單選取數(shù)據(jù)庫內(nèi)容實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
conda虛擬環(huán)境下使用pyinstaller打包程序?yàn)閑xe文件全過程
pyinstaller是一個(gè)支持跨平臺(tái)使用的第三方庫,它可以將腳本執(zhí)行所需的模塊和庫,自動(dòng)分析、收集并生成一個(gè)文件夾或者可執(zhí)行文件,這篇文章主要給大家介紹了關(guān)于conda虛擬環(huán)境下使用pyinstaller打包程序?yàn)閑xe文件的相關(guān)資料,需要的朋友可以參考下2023-12-12
Python爬取商家聯(lián)系電話以及各種數(shù)據(jù)的方法
今天小編就為大家分享一篇Python爬取商家聯(lián)系電話以及各種數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11
Python回調(diào)函數(shù)用法實(shí)例詳解
這篇文章主要介紹了Python回調(diào)函數(shù)用法,以實(shí)例形式較為詳細(xì)的分析了Python回調(diào)函數(shù)的定義、功能及相關(guān)使用技巧,需要的朋友可以參考下2015-07-07
對(duì)Python3之方法的覆蓋與super函數(shù)詳解
今天小編就為大家分享一篇對(duì)Python3之方法的覆蓋與super函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06

