python 使用装饰器统计调用方法的资源占用情况

# -*- coding: utf8 -*-
import time
import psutil
import os
from functools import wraps


def monitor_resources(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        process = psutil.Process(os.getpid())  # 获取当前进程

        # 获取初始资源占用情况
        initial_memory = process.memory_info().rss  # 以字节为单位
        initial_cpu = process.cpu_percent(interval=0.1)  # 获取CPU使用率
        initial_disk_io = psutil.disk_io_counters()  # 获取磁盘I/O信息

        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()

        end_memory = process.memory_info().rss
        end_cpu = process.cpu_percent(interval=0.1)
        end_disk_io = psutil.disk_io_counters()

        # 计算耗时、内存使用、CPU使用率和磁盘IO
        duration = end_time - start_time
        memory_used = (end_memory - initial_memory) / (1024 * 1024)
        cpu_used = end_cpu
        disk_read = end_disk_io.read_bytes - initial_disk_io.read_bytes
        disk_write = end_disk_io.write_bytes - initial_disk_io.write_bytes
        # 输出资源使用情况
        print("function:{func_name} executed cost time:{cost_time}秒".format(func_name=func.__name__, cost_time=duration))
        print("function:{func_name} executed memory_used:{memory_used}MB".format(func_name=func.__name__, memory_used=memory_used))
        print("function:{func_name} executed cpu_used:{cpu_used}%".format(func_name=func.__name__, cpu_used=cpu_used))
        print("function:{func_name} executed Disk I/O - Read:{disk_read}MB,Write:{disk_write}MB".format(func_name=func.__name__,
                                                                                                        disk_read=disk_read / (1024 ** 2), 
                                                                                                        disk_write=disk_write / (1024 ** 2)))
        return result
    return wrapper


@monitor_resources
def example_function():
    """
    模拟调用
    """
    total = 0
    for i in range(10**7):
        total += i
    return total


if __name__ == '__main__':
    # 调用示例函数
    example_function()

输出结果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值