import time

class myTimer:
    def __init__(self):
        self.start_time = 0
        self.end_time = 0
    
    def start(self):
        """开始计时"""
        self.start_time = time.ticks_ms()
        return self
    
    def stop(self):
        """停止计时"""
        self.end_time = time.ticks_ms()
        return self
    
    def reset(self):
        """重置计时器"""
        self.start_time = 0
        self.end_time = 0
        return self
    
    def elapsed(self):
        """返回经过的秒数"""  
        _s = self.elapsed_ms() / 1000.0
        return _s
    
    def elapsed_ms(self):
        """返回经过的毫秒数""" 
        _end = time.ticks_ms()
        _ms = time.ticks_diff(_end, self.start_time)
        return _ms
    
    def __enter__(self):
        """支持with语句的上下文管理器"""
        return self.start()

    def __exit__(self, exc_type, exc_val, exc_tb):
        """支持with语句的上下文管理器"""
        self.stop()
        return False  # 不处理异常


def example_function():
    """示例函数：模拟一些耗时操作"""
    time.sleep(1)  # 模拟耗时1秒的操作  

def measure_time(func=None, *, unit='s', print_result=True):
    """
    装饰器：测量函数运行时间
    
    参数:
        func: 要测量的函数
        unit: 时间单位，'s'表示秒，'ms'表示毫秒
        print_result: 是否打印结果，True表示打印，False表示不打印
        
    返回:
        如果print_result为True，则返回原函数的返回值
        如果print_result为False，则返回(原函数返回值, 运行时间)的元组
    
    用法:
        @measure_time
        def my_function():
            # 函数代码
            
        @measure_time(unit='ms', print_result=False)
        def my_function():
            # 函数代码
            result = my_function()  # 返回原函数结果
            
        result, time_cost = my_function()  # 当print_result=False时，返回(结果, 时间)元组
    """
    def decorator(func):
        import functools
        
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            timer = myTimer()
            timer.start()
            result = func(*args, **kwargs)
            
            if unit.lower() == 's':
                time_cost = timer.elapsed()
                unit_str = "秒"
            else:
                time_cost = timer.elapsed_ms()
                unit_str = "毫秒"
            
            if print_result:
                print(f"函数 {func.__name__} 运行时间: {time_cost:.3f} {unit_str}")
                return result
            else:
                return result, time_cost
                
        return wrapper
    
    # 支持@measure_time和@measure_time()两种调用方式
    if func is None:
        return decorator
    return decorator(func)

def main():
    # 方式1：使用start/stop方法
    timer = myTimer()
    timer.start()
    example_function()
    timer.stop()
    costTime = timer.elapsed_ms()
    print(f"方式1 - 函数运行时间: {costTime:.3f} 毫秒")
    
    # 方式2：使用with语句（更优雅的方式）
    with myTimer() as timer:
        example_function()
    
    costTime = timer.elapsed()
    print(f"方式2 - 函数运行时间: {costTime:.3f} 秒")
    
    '''
    # 方式3：使用装饰器（最简洁的方式）
    @measure_time
    def test_function():
        time.sleep(1.5)  # 模拟耗时1.5秒的操作
        return "完成"
    
    result = test_function()
    print(f"返回结果: {result}") 
    
    # 方式4：使用装饰器并自定义参数
    @measure_time(unit='ms', print_result=False)
    def another_test():
        time.sleep(0.7)  # 模拟耗时0.7秒的操作
        return "另一个测试完成"
    
    result, time_taken = another_test()
    print(f"函数返回: {result}, 耗时: {time_taken:.3f} 毫秒")
    '''

if __name__ == '__main__':
    main()