我假设您不是在谈论另一个答案所指的测试套件代码覆盖率。这确实是 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 中,这样可以很明显地看到您的程序在哪些代码路径中花费的时间最多。