0

我试图在运行时多次启动和停止 Python 函数的行分析。因此,我想在开始新的分析时重置已经收集的统计信息。有没有办法做到这一点?

由于缺乏明显的解决方案,我还尝试用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()不能被包装两次?

4

1 回答 1

0

我提出了以下基于新探查器类的解决方案。每次启动分析时,它都会创建一个新的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()
于 2022-02-11T07:02:35.050 回答