首页 > 解决方案 > 计算两个重写方法之间的时间

问题描述

我正在开发一个 python 程序,我想计算两个覆盖方法之间的时间。这是我的代码:

from time import time

........
# Code
........

class management:
start_time = time()
    def method1(effect):
        time1 = time() - start_time
        print(f'{effect.src_file} from the method2 started successfully')
        return time1
    
    def method2(effect):
        time2 = time() - start_time()
        print(f'{effect.src_file} from the method2 started successfully')
        return time2

effect_one = management.method1
effect_two = management.method2

.......
# Code
.......

现在的问题是我不知道method1 或method2 什么时候执行。它可以在程序运行时之间的任何时间。

那么如何获得两种方法之间的时间间隔。

注意:当一个方法被执行时,其他方法会在它之后立即执行(我不知道时间!)

标签: python

解决方案


如果你不想management用与时间相关的属性来污染你的类,你可以将它委托给另一个类,我们称之为Timer

import time
import functools

class Timer:
    def __init__(self):
        self.start_time = None
        self.end_time = None
        
    def start(self, f):
        @functools.wraps(f)
        def _(*args, **kwargs):
            self.start_time = time.time()
            return f(*args, **kwargs)
        return _
        
    def stop(self, f):
        @functools.wraps(f)
        def _(*args, **kwargs):
            self.end_time = time.time()
            return f(*args, **kwargs)
        return _
        
    @property
    def diff_time(self):
        return self.end_time - self.start_time

此类包含两个装饰器方法:start,它将start_time在其装饰函数启动时设置属性;和end,它将end_time在其装饰函数启动时设置属性。它还包含一个diff_time属性,它将存储结束时间和开始时间之间的时间差。

现在,假设您的课程如下所示:

class Foo:
    def bar(self):
        print("bar called")
    
    def baz(self):
        print("baz called")

您可以创建一个实例并包装所需的方法:在这种情况下,我们将计算和Timer之间的差异调用时间:barbaz

timer = Timer()
Foo.bar = timer.start(Foo.bar)
Foo.baz = timer.stop(Foo.baz)

然后,只需正常运行您的代码:

foo = Foo()
foo.bar()
time.sleep(2)
foo.baz()

完成测量后,您可以检查经过了多少秒:

print(timer.diff_time)
# Outputs 2.002431869506836

推荐阅读