Python sys.monitoring低开销代码监控替代sys.settrace
sys.settrace 是 Python 中用于调试和性能分析的传统方法,但它会显著降低程序执行速度,因为每次函数调用、行执行或异常抛出都会触发回调。Python 3.11 引入了 sys.monitoring 模块,提供了一种低开销的替代方案,允许你监控代码执行而不会造成巨大性能损失。
为什么选择 sys.monitoring
sys.settrace 的主要问题是其高开销。每次代码执行时,解释器都会调用你设置的回调函数,这会拖慢整个程序。相比之下,sys.monitoring 使用更高效的机制,仅在特定事件发生时触发回调,从而减少性能影响。
基本用法
1. 导入模块
导入 sys 和 sys.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.monitoring 是 sys.settrace 的现代替代方案,适用于需要监控代码执行而不想牺牲性能的场景。通过选择合适的事件类型和优化回调函数,你可以实现高效的代码监控。

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