如何 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()
我试图在运行时多次启动和停止 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()