如何 clear/reset Python 线路分析器的结果?

How to clear/reset results of the Python line profiler?

我试图在运行时多次启动和停止 Python 函数的 line profiling。因此,我想在开始新的分析时重置已经收集的统计数据。有办法吗?

由于缺乏明显的解决方案,我还尝试用新实例替换线路分析器 lp

#!/usr/bin/env python3
from line_profiler import LineProfiler

lp = LineProfiler()

@lp
def count():
    return sum(range(1_000_000))

count()
lp.print_stats()

# reset line profiler
new_lp = LineProfiler()
for f in lp.functions:
    new_lp(f)
lp = new_lp

count()
lp.print_stats()

但是不知何故新的统计数据是空的,可能是因为函数 count() 不能被包裹两次?

我想出了以下基于新分析器的解决方案 class。每次开始分析时,都会创建一个 LineProfiler 的新实例。关键是将包装函数存储在原始函数旁边,以便在停止分析器时可以重置它们。

from typing import Optional
from line_profiler import LineProfiler
from functools import wraps

class MyLineProfiler:

    def __init__(self):
        self.functions: list[list] = []
        self.line_profiler: Optional[LineProfiler] = None

    def __call__(self, func):
        index = len(self.functions)

        @wraps(func)
        def wrap(*args, **kw):
            return self.functions[index][1](*args, **kw)

        self.functions.append([func, func])
        return wrap

    def start(self):
        self.line_profiler = LineProfiler()
        for f in self.functions:
            f[1] = self.line_profiler(f[0])

    def stop(self, *, print: bool = True):
        for f in self.functions:
            f[1] = f[0]
        if self.line_profiler and print:
            self.line_profiler.print_stats()

    def reset(self):
        self.stop(print=False)
        self.start()

包装函数调用当前存储在 functions[index][1] 的任何内容,无论是原始的 func(当没有停止分析时)还是修饰的函数(当调用 start() 时)。

可以这样使用:

profile = MyLineProfiler()

@profile
def count():
    return sum(range(1_000_000))

count()

profile.start()
count()
count()
profile.stop()

profile.start()
count()
profile.stop()