Python - 代码耗时统计

本文介绍了如何使用Python编写一个装饰器函数,用于统计被装饰的函数执行时间。通过记录开始和结束时间戳,计算并打印出函数的执行时间。
部署运行你感兴趣的模型镜像

题目

  • 编写代码:编写装饰器函数,统计代码耗时情况

思路

  • 这题没有难度,直接编写一个装饰器函数,将要统计的函数作为装饰器函数的参数,在装饰器函数开始时记录一个时间,作为开始时间,然后开始执行要统计的函数,执行完成后,再记录一个时间作为结束时间,然后结束时间减去开始时间,就统计出来了要统计的函数的执行时间。

代码

import time

def exec_time(func):
    def wrapper(*args, **kwargs):                                               #定义装饰
        start_time = time.time()                                                #记录函数开始时间戳
        print("{fun}() start time:%s".format(fun = func.__name__) %start_time)  #打印开始的时间戳
        result = func(*args, **kwargs)                                          #装饰器内部调用原函数
        end_time = time.time()                                                  #记录函数结束时间戳
        print("{fun}() end time:%s".format(fun = func.__name__) %end_time)      #打印结束的时间戳
        print("{fun}() execution time:%5.2f".format(fun = func.__name__) %(end_time - start_time))#统计原函数执行时间
        return result                                                           #返回原函数执行结果
    return wrapper                                                              #返回装饰器函数引用

@exec_time                                                                      #装饰器配置
def timeFunc():
    sum = 0                                                                     #定义变量,初始值为0
    for i in range(999999):                                                     #遍历
        sum += i                                                                #计算和
    print("The sum is %s" %sum)                                                 #打印结果

if __name__ == "__main__":
    timeFunc()

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>嗯,用户现在想在Python统计程序的运行时间。我之前回答过类似的问题,但用户可能不太清楚具体该用哪个方法,特别是考虑到Python版本的变化。让我看看用户提供的引用内容。引用[1]提到time.clock()在Python3.3被废弃,3.8移除了,所以现在应该用perf_counter或process_time。引用[2]和[3]展示了使用time模块和装饰器的方法,引用[4]和[5]也提到了不同的方法,比如datetime模块。用户现在的问题是,如何正确地在Python统计运行时间,可能需要考虑不同版本的兼容性,以及不同场景下的适用方法。首先,我需要整理几种常用的方法,并说明它们的适用场景。比如,time模块的perf_counter适合测量代码段的执行时间,装饰器适合函数计时,上下文管理器适合代码块。同时要注意不同时间函数的区别,比如process_time只计算CPU时间,而perf_counter包括睡眠时间。然后,用户可能对如何选择合适的方法有疑问,比如什么时候用装饰器,什么时候用上下文管理器。需要比较这些方法的优缺点,以及性能差异。例如,datetime.now()的精度可能不如time模块的函数,但更易读。 还要注意版本兼容性,特别是用户可能还在使用旧代码中的time.clock(),需要提醒他们替换为perf_counter。另外,错误处理方面,比如避免在函数未返回时提前结束计时,或者在装饰器中正确处理返回值。可能还需要提到第三方库,如timeit,但用户的问题可能更关注标准库的方法。不过如果有必要,可以简要提及,作为扩展。最后,生成相关问题时,要围绕用户可能遇到的深入问题,比如性能分析、不同方法的区别、多线程下的计时等。确保问题覆盖用户可能的后续疑问。</think>### Python程序运行时间统计指南 #### 一、基础计时方法 1. **`time`模块核心方法** ```python import time start = time.perf_counter() # 高精度计时器[^1][^2] # 被测代码 end = time.perf_counter() print(f"耗时: {end - start:.4f}秒") ``` 2. **跨版本兼容方案** ```python # 自动适配Python版本 if hasattr(time, 'perf_counter'): timer = time.perf_counter else: timer = time.clock # 仅适用于Python2[^1] ``` #### 二、高级应用场景 1. **函数级计时装饰器** ```python from functools import wraps import time def timeit(func): @wraps(func) def wrapper(*args, **kwargs): start = time.perf_counter() result = func(*args, **kwargs) duration = time.perf_counter() - start print(f"{func.__name__}耗时: {duration:.6f}s") return result return wrapper @timeit def data_processing(): time.sleep(0.5) # 模拟数据处理 ``` 2. **代码块计时上下文管理器** ```python from contextlib import contextmanager import time @contextmanager def timer(): start = time.perf_counter() yield end = time.perf_counter() print(f"耗时: {end - start:.4f}秒") with timer(): time.sleep(1) # 被测代码块 ``` #### 三、性能对比表 | 方法 | 精度(秒) | 适用场景 | 包含睡眠时间 | |--------------------|----------|------------------------|--------------| | `time.time()` | 1e-6 | 粗略计时 | 是 | | `time.perf_counter`| 1e-9 | 高精度计时[^1][^2] | 是 | | `time.process_time`| 1e-9 | CPU时间统计[^4] | 否 | | `datetime.now()` | 1e-6 | 完整时间戳记录[^5] | 是 | #### 四、常见错误防范 1. **错误的重入计时** ```python # 错误示例:嵌套调用导致计时混乱 start = time.perf_counter() func1() # 内部也有计时逻辑 end = time.perf_counter() # 正确做法:使用独立上下文管理器 ``` 2. **精度损失问题** ```python # 错误的时间差计算 start = datetime.datetime.now() # 被测代码 end = datetime.datetime.now() print(end - start) # 精度仅到微秒级[^5] # 建议改用time.perf_counter() ``` #### 五、扩展应用示例 ```python # 统计循环平均耗时 import statistics times = [] for _ in range(10): start = time.perf_counter() # 被测代码 times.append(time.perf_counter() - start) print(f"平均耗时: {statistics.mean(times):.6f}±{statistics.stdev(times):.6f}s") # 多线程计时方案 from threading import Thread class TimedThread(Thread): def run(self): self.start_time = time.perf_counter() super().run() self.duration = time.perf_counter() - self.start_time t = TimedThread(target=time.sleep, args=(1,)) t.start() t.join() print(f"线程耗时: {t.duration:.4f}s") ``` --- ### 相关数学表达 程序运行时间的统计误差范围可表示为: $$ \epsilon = \frac{\sum_{i=1}^{n}|t_i - \bar{t}|}{n} $$ 其中$\bar{t}$为平均耗时,$n$为测试次数 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值