文章目录

Python sys.monitoring低开销代码监控替代sys.settrace

发布于 2026-05-10 02:19:46 · 浏览 15 次 · 评论 0 条

Python sys.monitoring低开销代码监控替代sys.settrace

sys.settrace 是 Python 中用于调试和性能分析的传统方法,但它会显著降低程序执行速度,因为每次函数调用、行执行或异常抛出都会触发回调。Python 3.11 引入了 sys.monitoring 模块,提供了一种低开销的替代方案,允许你监控代码执行而不会造成巨大性能损失。

为什么选择 sys.monitoring

sys.settrace 的主要问题是其高开销。每次代码执行时,解释器都会调用你设置的回调函数,这会拖慢整个程序。相比之下,sys.monitoring 使用更高效的机制,仅在特定事件发生时触发回调,从而减少性能影响。

基本用法

1. 导入模块

导入 syssys.monitoring 模块。

import sys
import sys.monitoring

2. 创建监控回调函数

定义 一个回调函数,当监控事件发生时执行。回调函数接收事件类型和参数。

def monitoring_callback(event, args):
    if event == sys.monitoring.events.LINE:
        print(f"Line executed: {args['line']}")
    elif event == sys.monitoring.events.CALL:
        print(f"Function called: {args['func_name']}")

3. 启用监控

创建 监控器并设置 回调函数。

monitor = sys.monitoring.create_monitor(sys.monitoring.DEFAULT_MONITOR)
monitor.set_events(sys.monitoring.events.LINE | sys.monitoring.events.CALL)
monitor.set_callback(monitoring_callback)
monitor.start()

4. 执行代码

运行 你想要监控的代码。

def example_function():
    for i in range(3):
        print(i)

example_function()

5. 停用监控

停止 监控器以避免持续开销。

monitor.stop()

监控事件类型

sys.monitoring 支持多种事件类型,你可以根据需要选择监控的事件。

事件类型 描述
LINE 每行代码执行时触发
CALL 函数调用时触发
RETURN 函数返回时触发
EXCEPTION 异常抛出时触发
C_EXCEPTION C 代码中异常抛出时触发

示例:仅监控函数调用和返回。

monitor.set_events(sys.monitoring.events.CALL | sys.monitoring.events.RETURN)

实际应用场景

性能分析

使用 sys.monitoring 监控函数执行时间,而不会显著影响性能。

import time

def performance_callback(event, args):
    if event == sys.monitoring.events.CALL:
        args['start_time'] = time.time()
    elif event == sys.monitoring.events.RETURN:
        duration = time.time() - args['start_time']
        print(f"Function {args['func_name']} took {duration:.6f} seconds")

monitor = sys.monitoring.create_monitor(sys.monitoring.DEFAULT_MONITOR)
monitor.set_events(sys.monitoring.events.CALL | sys.monitoring.events.RETURN)
monitor.set_callback(performance_callback)
monitor.start()

# 运行性能敏感代码
def heavy_computation():
    sum = 0
    for i in range(1000000):
        sum += i
    return sum

heavy_computation()
monitor.stop()

代码覆盖率分析

跟踪 哪些代码行被执行,用于测试覆盖率分析。

executed_lines = set()

def coverage_callback(event, args):
    if event == sys.monitoring.events.LINE:
        executed_lines.add(args['line'])

monitor = sys.monitoring.create_monitor(sys.monitoring.DEFAULT_MONITOR)
monitor.set_events(sys.monitoring.events.LINE)
monitor.set_callback(coverage_callback)
monitor.start()

# 运行测试代码
def test_function():
    if True:
        print("True branch")
    else:
        print("False branch")

test_function()
monitor.stop()

print("Executed lines:", executed_lines)

与 sys.settrace 的对比

特性 sys.settrace sys.monitoring
开销
事件粒度 细粒度(每行、每调用) 可配置(选择事件类型)
性能影响 显著 最小化
Python 版本 所有版本 3.11+

sys.monitoringsys.settrace 的现代替代方案,适用于需要监控代码执行而不想牺牲性能的场景。通过选择合适的事件类型和优化回调函数,你可以实现高效的代码监控。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文