Module xingyun.time.timer

Expand source code
import time
from timeit import default_timer as gettime
from prettytable import PrettyTable

class Timer:
        '''一个计时器。

        用法:
        with Timer(name):
                do_someting

        do_someting这段代码的用时会以name为键记录。
        Timer.output_all()会生成一个字符串描述已有的所有记录。

        示例:
        with Timer("hahah"):
                print (123)
        with Timer("sleep"):
                time.sleep(1)
        print(Timer.output_all())
        '''

        time_sum = {}
        count = {}
        before_enter = []
        before_exit = []

        def __init__(self , name):
                self.name = name

        def __enter__(self):
                for x in Timer.before_enter:
                        x()
                self.start_time = gettime()
                return self

        def __exit__(self , *args , **kwargs):
                for x in Timer.before_exit:
                        x()
                the_time = gettime() - self.start_time

                if self.time_sum.get(self.name) is None:
                        self.time_sum[self.name] = 0
                        self.count[self.name] = 0
                
                self.time_sum[self.name] += the_time
                self.count[self.name] += 1

        @classmethod
        def get_time(cls, name: str , average = False) -> float:
                if Timer.time_sum.get(name) is None:
                        return -1
                ret = Timer.time_sum[name]
                if average:
                        ret /= Timer.count[name]
                return ret

        @classmethod
        def get_avg_time(cls, name: str) -> float:
                return Timer.get_time(name , True)
        
        @classmethod
        def clear(cls):
                Timer.time_sum = {}
                Timer.count = {}

        @classmethod
        def get_all(cls, average = False) -> list[float]:
                time_sum = Timer.time_sum
                count = Timer.count

                ret = []
                for x in time_sum:
                        if average:
                                ret.append([x , time_sum[x] , count[x]])
                        else:
                                ret.append([x , time_sum[x] / count[x] , count[x]])

                return ret

        @classmethod
        def output_all(cls):
                def f2s(f):
                        return "%.10f" % f
                time_sum = Timer.time_sum
                count = Timer.count

                table = PrettyTable(["name" , "time (s)" , "count" , "avg_time (s)"])
                for x in time_sum:
                        table.add_row([x , f2s(time_sum[x]) , count[x] , f2s(time_sum[x] / count[x])])

                return str(table)

Classes

class Timer (name)

一个计时器。

用法: with Timer(name): do_someting

do_someting这段代码的用时会以name为键记录。 Timer.output_all()会生成一个字符串描述已有的所有记录。

示例: with Timer("hahah"): print (123) with Timer("sleep"): time.sleep(1) print(Timer.output_all())

Expand source code
class Timer:
        '''一个计时器。

        用法:
        with Timer(name):
                do_someting

        do_someting这段代码的用时会以name为键记录。
        Timer.output_all()会生成一个字符串描述已有的所有记录。

        示例:
        with Timer("hahah"):
                print (123)
        with Timer("sleep"):
                time.sleep(1)
        print(Timer.output_all())
        '''

        time_sum = {}
        count = {}
        before_enter = []
        before_exit = []

        def __init__(self , name):
                self.name = name

        def __enter__(self):
                for x in Timer.before_enter:
                        x()
                self.start_time = gettime()
                return self

        def __exit__(self , *args , **kwargs):
                for x in Timer.before_exit:
                        x()
                the_time = gettime() - self.start_time

                if self.time_sum.get(self.name) is None:
                        self.time_sum[self.name] = 0
                        self.count[self.name] = 0
                
                self.time_sum[self.name] += the_time
                self.count[self.name] += 1

        @classmethod
        def get_time(cls, name: str , average = False) -> float:
                if Timer.time_sum.get(name) is None:
                        return -1
                ret = Timer.time_sum[name]
                if average:
                        ret /= Timer.count[name]
                return ret

        @classmethod
        def get_avg_time(cls, name: str) -> float:
                return Timer.get_time(name , True)
        
        @classmethod
        def clear(cls):
                Timer.time_sum = {}
                Timer.count = {}

        @classmethod
        def get_all(cls, average = False) -> list[float]:
                time_sum = Timer.time_sum
                count = Timer.count

                ret = []
                for x in time_sum:
                        if average:
                                ret.append([x , time_sum[x] , count[x]])
                        else:
                                ret.append([x , time_sum[x] / count[x] , count[x]])

                return ret

        @classmethod
        def output_all(cls):
                def f2s(f):
                        return "%.10f" % f
                time_sum = Timer.time_sum
                count = Timer.count

                table = PrettyTable(["name" , "time (s)" , "count" , "avg_time (s)"])
                for x in time_sum:
                        table.add_row([x , f2s(time_sum[x]) , count[x] , f2s(time_sum[x] / count[x])])

                return str(table)

Class variables

var before_enter
var before_exit
var count
var time_sum

Static methods

def clear()
Expand source code
@classmethod
def clear(cls):
        Timer.time_sum = {}
        Timer.count = {}
def get_all(average=False) ‑> list[float]
Expand source code
@classmethod
def get_all(cls, average = False) -> list[float]:
        time_sum = Timer.time_sum
        count = Timer.count

        ret = []
        for x in time_sum:
                if average:
                        ret.append([x , time_sum[x] , count[x]])
                else:
                        ret.append([x , time_sum[x] / count[x] , count[x]])

        return ret
def get_avg_time(name: str) ‑> float
Expand source code
@classmethod
def get_avg_time(cls, name: str) -> float:
        return Timer.get_time(name , True)
def get_time(name: str, average=False) ‑> float
Expand source code
@classmethod
def get_time(cls, name: str , average = False) -> float:
        if Timer.time_sum.get(name) is None:
                return -1
        ret = Timer.time_sum[name]
        if average:
                ret /= Timer.count[name]
        return ret
def output_all()
Expand source code
@classmethod
def output_all(cls):
        def f2s(f):
                return "%.10f" % f
        time_sum = Timer.time_sum
        count = Timer.count

        table = PrettyTable(["name" , "time (s)" , "count" , "avg_time (s)"])
        for x in time_sum:
                table.add_row([x , f2s(time_sum[x]) , count[x] , f2s(time_sum[x] / count[x])])

        return str(table)