gpt4 book ai didi

python - 如何衡量覆盖率(在生产系统中)?

转载 作者:行者123 更新时间:2023-12-03 14:15:01 24 4
gpt4 key购买 nike

我想测量在生产系统中执行的 Python 代码的覆盖率。

我想回答这个问题:

Which lines get executed often (hot spots) and which lines are never used (dead code)?



当然,这不能减慢我的生产站点的速度。

我是 不是 谈论测量测试的覆盖率。

最佳答案

我假设您不是在谈论另一个答案所指的测试套件代码覆盖率。这确实是 CI 的工作。

如果您想知道在您的生产系统中哪些代码路径经常被访问,那么您将不得不进行一些检测/分析。这将有成本。您不能免费添加测量值。你可以很便宜地完成它,通常你只会运行很短的时间,足够长的时间直到你拥有你的数据。

Python 有 cProfile进行完整的分析,测量每个函数的调用计数等。这将为您提供最准确的数据,但可能会对性能产生相对较高的影响。

或者,您可以进行统计分析,这基本上意味着您可以在计时器上对堆栈进行采样,而不是对所有内容进行检测。即使采样率很高,这也可以便宜得多!缺点当然是精度损失。

尽管在 Python 中做起来非常容易,但这里的答案仍然有点多。有一个优秀的blog post by the Nylas team在这个确切的话题上。

下面的采样器是从 Nylas 博客中提取的,并进行了一些调整。启动后,它每毫秒触发一次中断并记录当前调用堆栈:

import collections
import signal

class Sampler(object):
def __init__(self, interval=0.001):
self.stack_counts = collections.defaultdict(int)
self.interval = interval

def start(self):
signal.signal(signal.VTALRM, self._sample)
signal.setitimer(signal.ITIMER_VIRTUAL, self.interval, 0)

def _sample(self, signum, frame):
stack = []
while frame is not None:
formatted_frame = '{}({})'.format(
frame.f_code.co_name,
frame.f_globals.get('__name__'))
stack.append(formatted_frame)
frame = frame.f_back
formatted_stack = ';'.join(reversed(stack))
self.stack_counts[formatted_stack] += 1
signal.setitimer(signal.ITIMER_VIRTUAL, self.interval, 0)


您验货 stack_counts看看你的程序做了什么。此数据可以绘制在 flame-graph 中这使得非常明显地看到您的程序在哪些代码路径中花费的时间最多。

关于python - 如何衡量覆盖率(在生产系统中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61951275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com