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