以下工具类代码来自开源项目pyslam
。
Timer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
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 |
用法
1
2
3
4
5
6
7
|
import Timer timer = Timer(is_verbose = True ) timer.start() # 此处是你的代码 timer.elapsed() |
效果
TimerFps
在上面的基础上,再加上下面代码段:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
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) |
用法
1
2
3
4
5
6
7
|
import TimerFps timer = TimerFps(name = '') timer.start() # 这里是你的代码 timer.refresh() |
效果
到此这篇关于Python Timer和TimerFPS计时工具类的文章就介绍到这了,更多相关Python 计时工具类内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://xfxuezhang.blog.csdn.net/article/details/122407412