2016-06-28 119 views
1

我目前正在使用cProfile(以及其他)在Python中执行一些分析任务。在documentation它说:为什么确定性分析器称为“确定性”?

CPROFILE和配置文件提供Python程序的确定性分析

在分析,我不断收到稍有不同的结果与CPROFILE整个程序以及各个功能。这很好,我想我至少明白一些原因 - 例如,某些操作系统任务可能会在后台运行,并减慢我的程序。毕竟,cProfile实时运行,而不是CPU时间。

但是,它仍然引发了一个问题:如果每次都不会产生相同的结果,为什么称为确定性分析?

+0

[向下滚动文档。](https://docs.python.org/2/library/profile.html#what-is-deterministic-profiling) – Pointy

+0

这是一个10美元的单词10美分概念。它的基础是空洞的假设,即测量可以帮助你找到可能的加速,而不是。从那里忘记你的目标只是一个愚蠢的步骤,而是专注于测量的准确性*。在这个网站上有很多头脑硬的程序员知道它们的区别。 [*以下是一些疯狂的想法,以及实际工作原理。*](http://stackoverflow.com/a/1779343/23771) –

+0

10美元vs 10美分:) 我会读你的这篇文章乍一看似乎很有趣。 –

回答

0

问题是回答在documentation

27.4.5。什么是确定性分析?

确定性分析旨在反映所有函数调用,函数返回和异常事件都受到监视,并且对这些事件之间的间隔(在此期间用户的代码正在执行)进行精确定时。相比之下,统计分析(这不是由该模块完成的)随机采样有效指令指针,并推断出在哪里花费时间。后一种技术传统上涉及较少的开销(因为代码不需要检测),但仅提供时间花费在何处的相对指示。

在Python中,由于在执行过程中有一个解释器处于活动状态,因此不需要检测代码来进行确定性分析。 Python会为每个事件自动提供一个钩子(可选回调)。此外,Python的解释性质往往会增加执行的开销,确定性分析往往只会在典型应用程序中增加小的处理开销。其结果是确定性分析并不昂贵,但它提供了有关Python程序执行的大量运行时统计信息。

通话计数统计可用于识别代码中的错误(令人惊讶的计数),并识别可能的内联扩展点(高通话计数)。内部时间统计可以用来识别应该仔细优化的“热循环”。应使用累积时间统计来识别算法选择中的高级错误。请注意,在此分析器中对累计时间的异常处理允许将算法的递归实现的统计信息直接与迭代实现进行比较。

这意味着它不取决于某些采样,并在相同的条件下应该重现数据。

+0

啊,所以术语'确定性'只是用来区分它与统计分析器?我想这只是一个语义问题,但“确定性”分析器可以为相同的输入返回不同的结果的事实只是以错误的方式揉搓我。如果cProfile实际测量的是CPU时间而不是实时,那将会更有意义。哦,好吧.....但谢谢你回答! –